从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。