为什么字符串只能输出不全

爵士无理 2018-07-20 01:28:21
#include <stdio.h>
#include <stdlib.h>
void put(char *s);

int main(int argc, char *argv[])
{
char s1[]="hello world";
put(s1);
putchar('\n');
return 0;
}
void put(char *s)
{
int i ;
for (i=0;s[i]!='\0' ;i++ )
{
putchar(*s++);
}
}
。。。。。。。。。。。。。。。。。。。。。。。。。
//为什么只能输出 一个 hello????
...全文
507 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-07-23
  • 打赏
  • 举报
回复
引用 3 楼 qq_40478293 的回复:
put读取的字符串中有空格,所以被终止读取了

最好验证一下再确认你的思路是否正确。

遇到空格是不会终止输出的。
只输出hello的原因是i在变化,s的地址也在发生变化,一次循环其实i向后了2次,但是输出时没有借助i;
void  put(char *s)
{
int i ;
for (i=0;s[i]!='\0' ;i++ )
{
//putchar(*s++);
putchar(s[i]);
}
}

这样就可以全部输出了
zangfong 2018-07-20
  • 打赏
  • 举报
回复
赵4老师说得非常有道理,不过有时候也可以通过打印中间变量来调试程序,也可以带来不少收获。
#include <stdio.h>
#include <stdlib.h>
void put(char *s);

int main(int argc, char *argv[])
{
char s1[]="hello world";
put(s1);
putchar('\n');
return 0;
}
void put(char *s)
{
int i ;
for (i=0; s[i]!='\0' ; i++ )
{
printf("i = %d, putchar(*s++) = ",i);
putchar(*s++);
printf(", after *s++, s = \"%s\", when i = %d,s[%d] = %c\n",s, i+1, i+1, s[i+1]);
}
}

结果如图

赵4老师 2018-07-20
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
Smilingmm 2018-07-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
我也是经常程序出问题,但是不知道怎么调试,以前用过vc6++设断点调试,但是调试结果和我想得不一样,而输出结果却是正确的,不知道是我自己的断点没设对,还是什么原因,有没有介绍VS调试方面的内容,书或者视频,或者其他的可以推荐一下吗,谢谢
kfyniriu1 2018-07-20
  • 打赏
  • 举报
回复
i=0时,s[i]='h',输出*s++ 即打印字符 'h';同时指针向后移一位,指向e;
i=1时,s[i]='l' , 输出*s++ 即打印字符 'e' ; 同时指针向后移一位,指向l(第一个L);
i=2时,s[i]='o' , 输出*s++ 即打印字符 'l' ; 同时指针向后移一位,指向l(第二个L);
依次往下推理,就是s[i]='\0',已经判断完了,循环结束,putchar才打印到hello这个位置;

可以修改为:putchar(*(s+i)); 或 purchar(s[i]);
woailaixiangnan 2018-07-20
  • 打赏
  • 举报
回复
put读取的字符串中有空格,所以被终止读取了
灌水号 2018-07-20
  • 打赏
  • 举报
回复
因为putchar(*s++);这里s++,s应该变了,到hello 输出完的时候s[i]已经是0了。
赵4老师 2018-07-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧