鱼C论坛

 找回密码
 立即注册
查看: 2357|回复: 12

[已解决]请问一下这个题怎么做

[复制链接]
发表于 2017-11-6 15:23:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
.写程序,完成从标准输入到标准输出的复制。
1)遇到连续空格只输出一个空格字符;
2)每个词放在一行;


  1. #include <stdio.h>
  2. int main()
  3. {
  4.         char ch;
  5.         ch=getchar();
  6.         while (scanf("%f",&ch)==1)
  7.                 if(ch=="  ") break;
  8.                 else continue;
  9.         printf("以Ctrl+Z结束循环");
  10. }
  11.         printf(" ")
复制代码
最佳答案
2017-11-6 16:46:43
AppleBJTU 发表于 2017-11-6 15:25
自己写不下去了。。

你要的是不是输入的时候不管中间间隔多少个空格都显示一个,然后所有单词都在同一行显示?
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int flag = 0;        // 记号:如果连续的空格,先输出一个,其余的不要输出
  5.         char ch;

  6.         ch = getchar();
  7.         while (1)
  8.         {
  9.                 putchar(ch);        // 输出

  10.                 while ( (ch=getchar()) == ' ' )                // 遇到空格
  11.                 {
  12.                         if ( !flag )        // 判断有没有输出过,没有就进入
  13.                         {
  14.                                 flag = 1;        // 把记号改为已经输出了,后面的空格自动忽略
  15.                                 putchar(ch);        //输出空格
  16.                         }
  17.                 }
  18.                 flag = 0;                // 连续空格后恢复记号,用于下一次连续的记号
  19.                
  20.                 if ( ch == '\n' )        // 输入完毕的回车标志就退出循环
  21.                         break;
  22.         }
  23.         printf("\n");

  24.         return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-6 15:23:50 | 显示全部楼层
怎么把所有词放在一行,还让输入多个空格只输出一个空格呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-6 15:25:57 | 显示全部楼层
自己写不下去了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 16:45:22 | 显示全部楼层
没搞明白意思,是输入一段话,然后再按你说的要求输出,还是输入一个显示一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 16:46:43 | 显示全部楼层    本楼为最佳答案   
AppleBJTU 发表于 2017-11-6 15:25
自己写不下去了。。

你要的是不是输入的时候不管中间间隔多少个空格都显示一个,然后所有单词都在同一行显示?
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int flag = 0;        // 记号:如果连续的空格,先输出一个,其余的不要输出
  5.         char ch;

  6.         ch = getchar();
  7.         while (1)
  8.         {
  9.                 putchar(ch);        // 输出

  10.                 while ( (ch=getchar()) == ' ' )                // 遇到空格
  11.                 {
  12.                         if ( !flag )        // 判断有没有输出过,没有就进入
  13.                         {
  14.                                 flag = 1;        // 把记号改为已经输出了,后面的空格自动忽略
  15.                                 putchar(ch);        //输出空格
  16.                         }
  17.                 }
  18.                 flag = 0;                // 连续空格后恢复记号,用于下一次连续的记号
  19.                
  20.                 if ( ch == '\n' )        // 输入完毕的回车标志就退出循环
  21.                         break;
  22.         }
  23.         printf("\n");

  24.         return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-11-6 17:55:24 | 显示全部楼层
闪电猫网络 发表于 2017-11-6 16:45
没搞明白意思,是输入一段话,然后再按你说的要求输出,还是输入一个显示一个

说实话,我也没看懂题目的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-6 19:24:32 | 显示全部楼层
丶忘却的年少o 发表于 2017-11-6 16:46
你要的是不是输入的时候不管中间间隔多少个空格都显示一个,然后所有单词都在同一行显示?

嗯嗯我觉得应该就是这个意思,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-9 11:19:18 | 显示全部楼层
本帖最后由 AppleBJTU 于 2017-11-9 11:20 编辑
丶忘却的年少o 发表于 2017-11-6 16:46
你要的是不是输入的时候不管中间间隔多少个空格都显示一个,然后所有单词都在同一行显示?

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int flag = 0;
  5.         char ch;
  6.         while ((ch=getchar())!=EOF)
  7.         {
  8.                 putchar(ch);
  9.                         while((ch=getchar())==' ')
  10.                         {
  11.                                 if(flag!=0)
  12.                                 {
  13.                                         flag = 1;
  14.                                         putchar(ch);
  15.                                 }       
  16.                         }
  17.                         flag = 0;       
  18.                 if(ch=='\n')  
  19.                                 break;}
  20.         printf("\n");
  21.         return 0;
  22. }
复制代码



请问一下这样的程序哪里出了问题??

我按照你的思路自己试了以后运行不太对,麻烦您了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-9 12:32:58 | 显示全部楼层
AppleBJTU 发表于 2017-11-9 11:19
请问一下这样的程序哪里出了问题??

我按照你的思路自己试了以后运行不太对,麻烦您了。

你这个程序,问你就大了。跟着我的分析来看看你自己的程序,从简单的问题开始:
1. if ( flag != 0 )这句,你想想,一开始flag=0,第一次碰到空格,但是到这句话判断的时候却不成立,没办法执行内部语句,并且可以说flag一直都是0,没办法变成1。那么这里就要修改为if ( flag == 0 ),也就是说要是没有输出过空格,那就执行内部语句(输出+标志位置1代表输出了)。
2. 改完上面的程序,你运行,输入“sd      d”少了字符。这里从第一个while看起,首先得到s,并且输出了,第二个while得到了d,发现不是空格,那就执行下面的语句,那么问题来了,d怎么办?没输出呀。所以要在flag前加一句putchar(ch);
3. 改完上面那个地方,同样输入“sd    d”发现中间出现多个空格。首先判定第二个while出问题了,没办法减掉多余的空格,那事实是这样吗?通过自己的大脑走一遍第二个while循环,发现没有问题,那么回到第一个while结合起来看。首先拿到s并输出,第二个while拿到d并输出,返回到第一个while拿到空格并输出,第二个while也拿到空格并输出一次,那么问题就在这里,程序的初衷是第二个while控制空格输出,现在第一个while也来参一脚,那问题就出现了,那现在要做的就是取消第一个while的空格输出。那怎么做那?就是不让它获取字符,直接死循环while (1),让它只做一件事,就是保证内部的代码一直循环就好了,反正内部有一个判断遇到\n就退出,能保证不会真的死循环。
4. 改完前面的代码,再次输入,发现程序输出有一个乱码,是错了吗?不是,自己大脑走一次程序,发现while里执行putchar(ch),那前面没有给ch输入呀,所以,在while前加一个ch = getchar()。
5. 再次输入,发现能出现重复的字符,为什么?肯定是第一个while内部的问题,大脑走一次,发现第2次操作的时候我们加了一个putchar(ch),这里和一开始的putchar(ch)重复了,所以,直接去掉就可以了。
6. 再次输入,完美运行。
好了,写了这么多,别觉得长篇大论就不看了,我写的就是你以后要学的东西——调试与修改,思路都在里面了。这是毕竟之路,希望你能在编程的路上少花点不必要的时间吧,好好看,一次不懂看二次,看懂了以后就方便了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-11-9 20:43:55 | 显示全部楼层
丶忘却的年少o 发表于 2017-11-9 12:32
你这个程序,问你就大了。跟着我的分析来看看你自己的程序,从简单的问题开始:
1. if ( flag != 0 )这 ...

真的太感谢你了,这么细心耐心的解释,我下午活动结束的回来有些晚了,所以才看完你写的这些。因为也是才学C语言,练习也不多,所以自己的逻辑思维真的还是太弱了,自己干看真是看不出来什么问题。
在看完你的解释以后确实学到了很多,但还是有些小问题想请教一下。
1.!flag就是flag==0的意思吗?
2.当遇到第一个第一个空格的时候进入if语句,此时flag==1,然后输出第一个空格,当第一次结束if语句的时候是不经过if语句下面的flag==0了是吗,不然的话第二次的空格就又进入if语句中再次输出了对吧。
3.现在用一个if语句和flag就可以控制只输出一个空格,如果想不论多少个空格都只输出两个空格的话,是不是可以在第一if语句的大括号里flag==2或者3什么的,下面再加一个if语句大括号里写flag==2或者3什么的,其他不变,一次类推这个思路对吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-9 21:00:11 | 显示全部楼层
AppleBJTU 发表于 2017-11-9 20:43
真的太感谢你了,这么细心耐心的解释,我下午活动结束的回来有些晚了,所以才看完你写的这些。因为也是才 ...

1. 不是。“!”记住这个是非的意思,首先你要知道计算机只认0和非0,假设flag=0, if (flag)这个判断就是不成立,因为0就是假的,但是 if (!flag)这个就是真的,只要()里面的东西不是0,那这个判断就是真的。很绕,但是用多了,就习惯了。我那么写是怕你不理解,所以直接用关系式“==”来判断比较容易理解。
2. 对。但是你的后半句“不经过下面flag=0……”理解是错的。因为根本到不了这句,不过你是刚学,没明白还是可以理解,你看你的程序,{ }这个大括号代表了一个语句段,if语句是在while这个语句段里,执行完了if 语句后会先回到while 语句里去获得并判断。其实说白了,while{ }、for{ }就像一个圈,里面的东西执行完了,回回到开头,只有当开头的条件不满足才会离开这个圈。
3. 只需要改变那个if 语句的条件,改为 if ( flag < 2 ),然后里面的flag=1改为flag++。你这么想,一开始flag=0,第一个空格输出后flag=1,满足<2,所以可以再输出一个,那么flag就要自己增加计数,不能通过赋值去给它某个值了,因为这样太复杂了,首先要判断flag是多少,然后给它一个比自身大1的值,这个程序就会很大。所以只要让它自己自增就好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-11-9 21:13:43 | 显示全部楼层
丶忘却的年少o 发表于 2017-11-9 21:00
1. 不是。“!”记住这个是非的意思,首先你要知道计算机只认0和非0,假设flag=0, if (flag)这个判断就 ...

明白了明白了,真的感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-9 21:14:05 | 显示全部楼层
AppleBJTU 发表于 2017-11-9 21:13
明白了明白了,真的感谢!

不用客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 16:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表