C指针问题!

时间:2011-04-12 18:28:40

标签: c

为什么以下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
任何人都可以解释一下。

4 个答案:

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