从stdin中读取字符串的长度

我想从stdin中取一个字符串,但我不想要一个固定大小的静态数组

我知道scanf需要保存stdin输入的东西,但我不能这样做:

char string[10] scanf("%s",string); 

因为我需要知道字符串需要多长时间才能分配正确的内存空间。

你能帮我解决这个问题吗?


woooooooo

我仍然对这个问题感到困惑……我疯了

你能告诉我工作代码吗?

唯一可以确定的方法是做一个循环; 一次读一个字符并存储。 如果您分配的缓冲区已满,请将其增加一些适当的数量(建议一次超过一个字节用于性能,经典的经验法则是将其加倍)。

当你考虑字符串结束时停止,可能是换行或EOF。

不要使用scanf,使用fgets,这可以防止读入太多字符。

 char tmp[256]={0x0}; while(fgets(tmp, sizeof(tmp), stdin)!=NULL) { printf("%s", tmp); } 

fgets将在行的末尾返回’\ n’,当stdin关闭或遇到错误时返回NULL。

先玩它,看看它做了什么。 如果你需要将输入行分成字段,你可以在tmp上使用sscanf(),sscanf就像scanf一样,但是在字符串上。

如果你使用fgets()那么你很可能在缓冲区的末尾有一个'\n'字符,如果它足够大的话。 有些人可能希望通过strtok()函数删除它,但它是安全的。

我建议使用以下安全方法删除那个额外的特殊字符。

 char *get_line (char *s, size_t n, FILE *f) { char *p = fgets (s, n, f); if (p != NULL) strtok (s, "\n"); return p; } 

您可以使用以下方法处理char输入数据:

 int getc(FILE *stream); 

要么

 int getchar(void); 

您可以使用以下格式字符串:

 char string[10]; scanf("%10s" string); 

这会强制要求缓冲区边界,但要求格式字符串知道缓冲区的大小。 我通常通过将两者都声明为常量来克服这个问题:

 #define BUFSIZE 10 #define BUFFMT "%10s" 

如果你正在使用GNU系统,你也可以利用GNU扩展:getline(3)函数可以避免你很多麻烦! 看看这里 。

您可以确保不要像这样过度运行缓冲区:

  char buffer[128]; printf("Input Text: "); fgets(buffer,127,stdin); 

然后,如果您需要可变大小的输入,您只需保持相同的固定大小的输入量

如果您不想要固定大小的静态数组,请考虑使用动态分配的数组,该数组会根据需要增长。

如果您在支持POSIX 2008的Linux或其他系统上工作,则可以使用(较新的) getline()函数。 如果您无权访问此类function,请考虑使用相同的界面滚动自己的function。