如何动态接受带空格的字符串?我曾尝试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();
}
答案 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)
我想接受字符串而不指定刺痛大小。
这里有这样一个功能:
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
的缓冲区。