C中的翻译限制

时间:2015-05-24 02:41:59

标签: c arrays string character

我试图通过scanf来捕获用户的输入:

char numStrings[5000];   
printf("Enter string of numbers:\n\n"); 
scanf("%s", numStrings);

但是,输入的字符串长度为5000个字符。 c99中的翻译限制为4095个字符。我是否需要指导用户将他们的输入分成两半,还是有一个我无法想到的更好的工作?

3 个答案:

答案 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