字符串的长度

时间:2014-08-23 21:59:05

标签: c

当我进入时,为什么会这样;

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

我遇到了运行时错误;

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

工作得很好?

顺便说一句,当输入不是一个大字符串时,两者都工作正常。例如,当字符串为"abc"时,它在两种情况下均正常工作,但当它为"wqrjljowspxmsvkjkkogvcyheydhikggaypnjdkbvhnpcxyojowhquouuuceeimgicurheuenjtritfshbbyxpsrlwxpfjwpnsjxwdbjnxaxqhryisyhkqavnxnuillwdutzywkntkkmtckbuikga"时,它仅适用于第二种情况。

原谅我极长的弦乐。这是我的测试用例的一部分。

2 个答案:

答案 0 :(得分:7)

10^4的值为14,因为^是XOR运算符。

你不能简单地写1E4是10 4 ,因为那是一个浮点常数,数组边界必须是整数常量。你可以投了它(char string[(int)1E4];),但为什么不简单地写下你的意思:char string[10000];就像你在第二个例子中所做的那样。

你应该写一个论点:

if (scanf("%9999s", string) != 1)
    …handle input error or EOF…

这可以保护您免受缓冲区溢出的影响。

答案 1 :(得分:4)

char string[10^4];

上面是一个长度为14的数组,因为^是按位 - 或 - 不是幂。
所有其他的都与第二种情况相同,但上限要低得多。

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

以上有3个失败点:

  1. 10000字节可能太多(几乎总是在堆栈上,这通常是非常有限的。请考虑使用malloc()或静态缓冲区进行堆分配。)
  2. 输入可能包含一个长度超过9999字节的标记(终止符为+1)。
  3. 您不会检查输入失败,但可能会轻易地假设成功。