How can I read an input string of unknown length?

前端 未结 10 1313
逝去的感伤
逝去的感伤 2020-11-22 07:56

If I don\'t know how long the word is, I cannot write char m[6];,
The length of the word is maybe ten or twenty long. How can I use scanf to ge

相关标签:
10条回答
  • 2020-11-22 08:46

    Safer and faster (doubling capacity) version:

    char *readline(char *prompt) {
      size_t size = 80;
      char *str = malloc(sizeof(char) * size);
      int c;
      size_t len = 0;
      printf("%s", prompt);
      while (EOF != (c = getchar()) && c != '\r' && c != '\n') {
        str[len++] = c;
        if(len == size) str = realloc(str, sizeof(char) * (size *= 2));
      }
      str[len++]='\0';
      return realloc(str, sizeof(char) * len);
    }
    
    0 讨论(0)
  • 2020-11-22 08:51

    With the computers of today, you can get away with allocating very large strings (hundreds of thousands of characters) while hardly making a dent in the computer's RAM usage. So I wouldn't worry too much.

    However, in the old days, when memory was at a premium, the common practice was to read strings in chunks. fgets reads up to a maximum number of chars from the input, but leaves the rest of the input buffer intact, so you can read the rest from it however you like.

    in this example, I read in chunks of 200 chars, but you can use whatever chunk size you want of course.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* readinput()
    {
    #define CHUNK 200
       char* input = NULL;
       char tempbuf[CHUNK];
       size_t inputlen = 0, templen = 0;
       do {
           fgets(tempbuf, CHUNK, stdin);
           templen = strlen(tempbuf);
           input = realloc(input, inputlen+templen+1);
           strcpy(input+inputlen, tempbuf);
           inputlen += templen;
        } while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n');
        return input;
    }
    
    int main()
    {
        char* result = readinput();
        printf("And the result is [%s]\n", result);
        free(result);
        return 0;
    }
    

    Note that this is a simplified example with no error checking; in real life you will have to make sure the input is OK by verifying the return value of fgets.

    Also note that at the end if the readinput routine, no bytes are wasted; the string has the exact memory size it needs to have.

    0 讨论(0)
  • 2020-11-22 08:51

    I know that I have arrived after 4 years and am too late but I think I have another way that someone can use. I had used getchar() Function like this:-

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //I had putten the main Function Bellow this function.
    //d for asking string,f is pointer to the string pointer
    void GetStr(char *d,char **f)
    {
        printf("%s",d);
    
        for(int i =0;1;i++)
        {    
            if(i)//I.e if i!=0
                *f = (char*)realloc((*f),i+1);
            else
                *f = (char*)malloc(i+1);
            (*f)[i]=getchar();
            if((*f)[i] == '\n')
            {
                (*f)[i]= '\0';
                break;
            }
        }   
    }
    
    int main()
    {
        char *s =NULL;
        GetStr("Enter the String:- ",&s);
        printf("Your String:- %s \nAnd It's length:- %lu\n",s,(strlen(s)));
        free(s);
    }
    

    here is the sample run for this program:-

    Enter the String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!!
    Your String:- I am Using Linux Mint XFCE 18.2 , eclispe CDT and GCC7.2 compiler!! 
    And It's length:- 67
    
    0 讨论(0)
  • 2020-11-22 08:54

    I've seen only one simple way of reading an arbitrarily long string, but I've never used it. I think it goes like this:

    char *m = NULL;
    printf("please input a string\n");
    scanf("%ms",&m);
    if (m == NULL)
        fprintf(stderr, "That string was too long!\n");
    else
    {
        printf("this is the string %s\n",m);
        /* ... any other use of m */
        free(m);
    }
    

    The m between % and s tells scanf() to measure the string and allocate memory for it and copy the string into that, and to store the address of that allocated memory in the corresponding argument. Once you're done with it you have to free() it.

    This isn't supported on every implementation of scanf(), though.

    As others have pointed out, the easiest solution is to set a limit on the length of the input. If you still want to use scanf() then you can do so this way:

    char m[100];
    scanf("%99s",&m);
    

    Note that the size of m[] must be at least one byte larger than the number between % and s.

    If the string entered is longer than 99, then the remaining characters will wait to be read by another call or by the rest of the format string passed to scanf().

    Generally scanf() is not recommended for handling user input. It's best applied to basic structured text files that were created by another application. Even then, you must be aware that the input might not be formatted as you expect, as somebody might have interfered with it to try to break your program.

    0 讨论(0)
提交回复
热议问题