微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C指针问题!

如何解决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 输出是 计数= 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
函数将永远无法正常工作。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。