接受带空格的字符串

时间:2016-01-31 05:40:43

标签: c

如何动态接受带空格的字符串?我曾尝试gets(),但它无效,我不想从文件中获取输入。我想接受一个字符串而不指定字符串大小。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *accept()
{
    char *s;
    s = (char *)malloc(sizeof(char));
    gets(s);
    return s;
}

int main()
{
    char *str;
    printf("\nEnter`enter code here` one string");
    str = accept();
}

3 个答案:

答案 0 :(得分:2)

首先,永远不要使用gets()。请改用fgets()。如果溢出缓冲区,则gets()无法阻止。它已从C标准C11中删除。

下面,

 s = (char *)malloc(sizeof(char));

你只为一个char分配内存,这只足以使空字符终止字符串。您需要分配更多空间来读取一行。

 s = malloc(256); //sizeof(char) is always 1. So you don't have to multiply it.
 if( fgets(s, 256, stdin) == NULL )  { /* handle failure */
如果缓冲区有足够的空间,

fgets()也会读取换行符。因此,如果不需要,您可能希望删除。 您可以使用strcspn()删除它:

s[strcspn(s,"\n")] = 0;

答案 1 :(得分:2)

  

我想接受字符串而不指定刺痛大小。

  1. 以硬编码开头,作为字符串的初始大小。
  2. 逐个阅读字符。将字符添加到字符串中。如果行中的字符数超过当前大小,请增加字符串的大小。
  3. 这里有这样一个功能:

    char *accept()
    {
       // Initial size of the string.
       int size = 256;
       int c;
       int index = 0;
    
       char* s = malloc(size);
       if ( s == NULL )
       {
          return NULL;
       }
    
       while ( (c = getchar()) != EOF && c != '\n')
       {
          // We need one character for the terminating null character
          // Hence, if index is equal to (size-1), we need to resize the
          // string.
          if ( index == size - 1)
          {
             // Resize the string.
             size = size * 2;
             s = realloc(s, size);
             if ( s == NULL )
             {
                return NULL;
             }
          }
          s[index] = c;
          ++index;
       }
    
       // NUll terminate the string before returning it.
       s[index] = '\0';
       return s;
    }
    

    PS 不要使用gets。见Why is the gets function so dangerous that it should not be used?。如果您需要阅读一行文字,请使用fgets

答案 2 :(得分:0)

通过

定义用户输入的大致大小

#define LENGTH 30

char *accept(){
    char *s = (char*)malloc(sizeof(char)*LENGTH); 
    scanf("%29[0-9a-zA-Z ]", s); 
   //scanf("%[^\n]%*s", s); //or this
    return s;
}

请注意,29是将要读取的最大字符数,因此s必须至少指向大小为LENGTH-1的缓冲区。