我试图通过scanf来捕获用户的输入:
char numStrings[5000];
printf("Enter string of numbers:\n\n");
scanf("%s", numStrings);
但是,输入的字符串长度为5000个字符。 c99中的翻译限制为4095个字符。我是否需要指导用户将他们的输入分成两半,还是有一个我无法想到的更好的工作?
答案 0 :(得分:4)
你可以输入一个比这个大得多的字符串,在普通操作系统中堆栈至少为1MB,在Linux上它是8MB,这是实际的限制,1M是1024KB,所以你可以试试512KB,即524288B
char string[524288];
scanf("%524287s", string);
很可能是好的,如果它仍然太小,那么请使用malloc()
。
答案 1 :(得分:3)
不,如果输入超过设定长度,则无需指示用户将输入分开。限制是字符串文字,而不是字符串。有关详细信息,请参阅this stackoverflow主题中的答案。如果您不知道合理的最大长度是多少,那么如果您要使用的分隔符不是换行符,我建议使用getline()或getdelim()。
答案 2 :(得分:0)
我是否需要指示用户将他们的输入分成两半,或者是否有一个我无法想到的更好的工作?
就您提供的代码而言,如果输入字长于4999字节,那么您可能会遇到缓冲区溢出。是的,让某人(例如用户或接下来维护此代码的人)知道这是最大长度是明智的。很高兴您可以使用以下代码截断输入:scanf("%4999s" "%*[^ \n]", numStrings);
...在这种情况下,%*[^ \n]
指令执行截断。
如果你可以让用户知道它们溢出缓冲区,那就更好了,但scanf
并不能让这件事变得简单。对于用户来说,更好的是,如果你可以使用动态分配。
啊,输入动态大小的问题。如果可以避免,那就避免它。避免此问题的一种常用方法是要求argv
形式的输入,而不是stdin
......但这并非总是可行,有用或可行。
scanf
不会使这个问题变得特别容易解决;事实上,如果%s
以类似于fgets
的界面形式提供类似的功能,则会更容易解决。
如果没有进一步的说明,这里是我在this answer中编写的代码的改编版,用于阅读(并同时分配)单词的目的与{{ 1}},而不是 lines ,与%s
后面的过程类似。如果您想更多地了解它背后的灵感,请随时阅读该答案。
fgets