2017-03-09 67 views
-5

无论输入什么字符串,为什么输出始终为1。 请解释为什么这个C代码1的输出?

int main() { 
    char ch[]={}; 
    printf("%d", scanf("%s", ch)); 
    return 0; 
} 
+5

抛开未定义的行为,这个程序的输出很大程度上取决于您输入的内容。如果按下Ctrl + D(在Windows上按Ctrl-Z),程序将打印零。 – dasblinkenlight

+1

您可以通过阅读“scanf”的任何可用在线参考来轻松解决此问题。 – user694733

+2

你是“幸运的”它工作考虑'ch'没有大小 –

回答

3

手册页scanf的:

这些函数返回成功匹配 和分配输入项目的数量,这可以减少在 甚至是零比规定,或早期匹配失败的事件。

如果在第一次成功转换或发生匹配故障时 之前达到输入的结尾,则会返回值EOF。如果发生读取错误,EOF为 也会返回,在这种情况下,流的错误 指示符(请参阅ferror(3))已设置,并且errno设置为 表示错误。

所以,这意味着scanf()返回成功读取的项目数。

此外,C不允许零大小的数组。

C11 6.7.6.2组声明:

第1段:

除了可选的类型限定符和关键字静态的,则[ 和]可限定表达式或* 。如果它们分隔表达式 (其指定数组的大小),则表达式应该具有整数类型 。 如果表达式是一个常量表达式,则其应该具有大于零的值。元素类型不应为 不完整或函数类型。可选类型限定符和 关键字静态只能在函数 参数的声明中出现,并且只能在最外面的数组 类型派生中。

+0

这个答案是错误的,'char ch [] = {};'在C和C++中都是无效的。零大小的数组是不允许的。看现场演示[这里](http://coliru.stacked-crooked.com/a/1da9f5b8d1491d45) – Destructor

+0

@Destructor Hellos先生,我添加了关于零大小数组的段落。谢谢你的建议。 – rsp

3

因为scanf返回它读取的项目数。在你的情况下,它正在读取一个字符串,因此它返回1,然后通过printf打印到标准输出。

+1

您是不是指要阅读的项目数量? – anonymoose

+0

@anonymoose是的,确切的说。 – hmatar