为什么以下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
输出
count = 432
任何人都可以解释一下。
答案 0 :(得分:5)
您的5
格式字符串中似乎有%
而不是scanf
。 (也许键盘的换档键需要清洁。)
这意味着scanf
实际上并没有在缓冲区中读取任何内容。您的代码不会检查scanf
的返回值(它应该!),因此从不会注意到它失败了。所以你接着试图计算一个充满未初始化垃圾的缓冲区的长度。它可以给你432,或0或其他任何东西。
[编辑补充:] ...哦。即使你修复了它,它仍然无效,因为 scanf
会在看到空白字符时停止阅读,包括换行符,因此\n
你的{ {1}}函数正在查找不在缓冲区中。
顺便提一下,您是否了解C标准库中的get_length
函数?
答案 1 :(得分:3)
我认为你的意思是%s
,而不是5s
。
BTW,初始化数组(char buff[128] = {}
)会阻止你的数组无限制(count = 432
对你来说是任意的)。
然后您应该在*s != '\0'
中检查\n
,而不是get_length
- C样式字符串受NULL字符(\0
)限制,而不是换行符,无论您从用户输入中获取数据。该输入会丢失换行符。
答案 2 :(得分:1)
scanf
调用失败,因为您使用的格式无效。如果你想要一个长度为5的字符串,那么格式应该是"%5s"
而不是"5s"
,或者只有"%s"
,如果五个是完整的拼写错误。因此,字符缓冲区未初始化,并且在堆栈上遇到第一个随机'\n'
字符之前,您将获得字节数。此外,scanf
会忽略换行符。因此,您的get_length
函数永远不会按预期工作。
答案 3 :(得分:1)
我认为scanf正在读取你的字符串并将最后一个字符设置为'\ 0',但是你正在搜索'\ n',我认为这不是scanf实现中隐含的。
也就是说,检查'\ 0'而不是'\ n'。