问题描述
|
为什么以下C代码不输出10
#include<stdio.h>
#include<stdlib.h>
void get_length(char s[]);
int main( )
{
char buff[128];
printf(\"\\nEnter buffer data: \");
scanf(\"%s\",buff);
get_length(buff);
}
void get_length(char *s){
int count;
for(count = 0 ; *s != \'\\0\' ; s++)
count++;
printf(\"count = %d\\n\",count);
}
输入的是我是Rohit
输出是
计数= 432
谁能解释一下。
解决方法
您的
scanf
格式字符串中似乎有一个5
而不是%
。 (也许您的键盘的Shift键需要清洁。)
这意味着“ 3”实际上并没有读取任何内容到您的缓冲区中。您的代码不会检查scanf
的返回值(应该!),因此永远不会注意到它失败了。因此,您然后要尝试计算...充满未初始化垃圾的缓冲区的长度。它可能会给您432,或0,或其他任何值。
[编辑添加:] ...哦。即使您修复了该错误,它也仍然无法正常工作,因为scanf
会在看到空格字符(包括换行符)时停止读取,因此get_length
函数要查找的\\n
将不在缓冲区中。
顺便说一句,您知道C标准库中的strlen
函数吗?
,我想你的意思是10英镑,而不是11英镑。
顺便说一句,对数组进行值初始化(char buff[128] = {}
)将防止数组不受限制(count = 432
对您而言是任意的)。
然后,您应该在get_length
中检查*s != \'\\0\'
而不是\\n
-C样式的字符串以NULL字符(\\0
)而不是换行符为界,无论您从用户输入中获取数据是什么。换行符将从该输入中丢失。
,我认为scanf正在读取您的字符串并将最后一个字符设置为\'\\ 0 \',但是您正在搜索\'\\ n \',我认为这在scanf实现中并不隐含。
也就是说,检查\'\\ 0 \'而不是\'\\ n \'。
,scanf
呼叫失败,因为您使用了无效的格式。如果要使用长度为5的字符串,则格式应为\"%5s\"
而不是\"5s\"
,或者如果是五个完整的拼写错误,则应为\"%s\"
。因此,字符缓冲区未初始化,并且在堆栈上遇到第一个随机\'\\n\'
字符之前,您正在获取字节数。此外,“ 3”会忽略换行符。因此,您的get_length
函数将永远无法正常工作。