鱼C论坛

 找回密码
 立即注册
查看: 2489|回复: 24

[已解决]while循环中putchar为什么能够达到输出字符串的目的

[复制链接]
发表于 2020-2-29 20:39:24 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冷回清风暖 于 2020-2-29 20:43 编辑
  1. getchar()
复制代码
它是一个输入流的函数,从标准输入里读取下一个字符,也就是把输入的字符以队列的形式放入缓冲区,直到用户按回车为止。
  1. putchar
复制代码
作用是向终端输出一个字符,参数必须是一个字符,可以是介于0~127之间的一个十进制整型数。
不过我对下面这个程序不明白。
这个程序我想的是:
        每输入一个字符,会进入while循环
        getchar会将输入的字符所读应的ASCLL码放入缓冲区,并利用变量ch存储.
        紧接着进行字符大小写的替换
        接下来会运行到putchar函数,到这里应该输出当前字符
所以我预想的输出形式应该是:
        每输入一个字符,就会输出对这个字符进行大小写替换的结果,依次循环,最后回车结束程序。
但是运行后的结果是以字符串的形式显示的
        输入的字符显示在”请输入一行英文句子:“后面 ,按回车之后才输出的结果
和我想得输入一个字符,就输出这个字符转换后的结果,不一样
查了好久,不知道为什么
  1. #include <stdio.h>
  2. #define num 32;

  3. int main()
  4. {
  5.         int i , ch;
  6.         printf("请输入一行英文句子:");
  7.         while((ch = getchar())!='\n')//输入字符且并未按回车时进入循环
  8.         {
  9.             if (ch >= 'A' && ch <= 'Z')
  10.                 {
  11.                         ch = ch + num;
  12.                 }
  13.             else if('a' <= ch <= 'z')
  14.             {
  15.                 ch = ch - 32;
  16.             }
  17.             putchar(ch);//输出单个字符
  18.         }

  19.         return 0;
  20. }
复制代码
最佳答案
2020-2-29 21:59:23
        楼主试试这个代码
  1. #include <stdio.h>
  2. #include <conio.h>

  3. main(void)
  4. {
  5.         char c                                         ;
  6.         while((c = getch()) != '\r') {
  7.                 if (c < 32) c = 46                     ;
  8.                 else if (c >= 'A' && c <= 'Z') c += 32 ;
  9.                 else if (c >= 'a' && c <= 'z') c -= 32 ;
  10.                 putch(c)                               ;
  11.         }
  12.         printf("\n")                                   ;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-29 20:44:03 | 显示全部楼层

回帖奖励 +1 鱼币

字符串就是由一个一个字符组成的,用字符输出字符串是很正常的事情啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-29 20:45:35 | 显示全部楼层
qiuyouzhi 发表于 2020-2-29 20:44
字符串就是由一个一个字符组成的,用字符输出字符串是很正常的事情啊

我想的是这个程序里面
他应该是,输入一个字符 输出一个结果
而不是输入全部字符之后 在输出结果
putchar 不是用来输出单个字符的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 20:47:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 20:48:11 | 显示全部楼层
冷回清风暖 发表于 2020-2-29 20:45
我想的是这个程序里面
他应该是,输入一个字符 输出一个结果
而不是输入全部字符之后 在输出结果

循环上不是有注释吗
当输入的字符不为换行符时才进入循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-29 20:50:49 | 显示全部楼层
qiuyouzhi 发表于 2020-2-29 20:48
循环上不是有注释吗
当输入的字符不为换行符时才进入循环

每输入一个字符 就进入循环
就会执行一次putchar函数
那么输入Y
输出结果不应该是 Yy吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 20:53:29 | 显示全部楼层
冷回清风暖 发表于 2020-2-29 20:50
每输入一个字符 就进入循环
就会执行一次putchar函数
那么输入Y
  1. #include <curses.h>

  2. int main(void)
  3. {
  4.         initscr();
  5.         int ch;
  6.         while((ch = getch()) != 'q')
  7.                 printw("%c\n", ch);
  8.         endwin();
  9.         return 0;
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-29 20:56:23 | 显示全部楼层

我用的win10 没有curse这个库
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 21:15:20 | 显示全部楼层
看注释


  1. #include <stdio.h>
  2. #define num 32;

  3. int main()
  4. {
  5.         int i , ch;
  6.         printf("请输入一行英文句子:");   // 你输入一行字符后,字符串连同最后的回车都放在一个缓冲区buf中,只是这个是隐藏的你看不到
  7.         while((ch = getchar())!='\n')// getchar的作用相当于从缓冲区中读取buf[i], i=i+1。
  8.        {
  9.             if (ch >= 'A' && ch <= 'Z')
  10.                 {
  11.                         ch = ch + num;
  12.                 }
  13.             else if('a' <= ch <= 'z')
  14.             {
  15.                 ch = ch - 32;
  16.             }
  17.             putchar(ch);//输出buf[i]转换后的字符
  18.         }

  19.         return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 21:39:35 | 显示全部楼层
冷回清风暖 发表于 2020-2-29 20:56
我用的win10 没有curse这个库

vs  ?
dev++ ?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 21:59:23 | 显示全部楼层    本楼为最佳答案   
        楼主试试这个代码
  1. #include <stdio.h>
  2. #include <conio.h>

  3. main(void)
  4. {
  5.         char c                                         ;
  6.         while((c = getch()) != '\r') {
  7.                 if (c < 32) c = 46                     ;
  8.                 else if (c >= 'A' && c <= 'Z') c += 32 ;
  9.                 else if (c >= 'a' && c <= 'z') c -= 32 ;
  10.                 putch(c)                               ;
  11.         }
  12.         printf("\n")                                   ;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 10:30:56 | 显示全部楼层

code::blocks
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 13:47:51 From FishC Mobile | 显示全部楼层

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 10:10:29 | 显示全部楼层

???。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-3 00:04:14 From FishC Mobile | 显示全部楼层
作为初学者我也来猜猜。我想gechar函数应该是完成这么一个功能:你输入一行字符后,当按下回车时。这串字符连同“回车字符\n”才会被放入缓存区,这时候getchar函数才开始执行逐个读取字符串的每个字符,直到读取直至\n
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-3 12:57:04 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-3-3 13:01 编辑

借你这个题目,做做!一起加油!
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. int main()
  4. {
  5.         int j=1024;
  6.         char *c=(char *)malloc(j);
  7.         int i=0;
  8.         while (fgets(c,j,stdin))
  9.         {
  10.                 for (i=0;*(c+i);i++)
  11.                 {
  12.                         if (i==j-1) break;
  13.                         else if (*(c+i) >=65 && *(c+i) <= 90) *(c+i)+=32;
  14.                         else if (*(c+i) >=97 && *(c+i) <= 122) *(c+i)-=32;
  15.                 }
  16.                 printf("%sinput :",c);
  17.         }
  18.         return 0;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 12:57:45 | 显示全部楼层
Cool_Breeze 发表于 2020-3-3 12:57
借你这个题目,做做!一起加油!

哇 赞 我还没学到后面的动态内存分配
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-3 13:00:17 | 显示全部楼层
冷回清风暖 发表于 2020-3-3 12:57
哇 赞 我还没学到后面的动态内存分配

指针是最难得!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 13:19:43 | 显示全部楼层

最近一直在钻研指针 哈哈哈  C语言的精髓在指针
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-3 13:47:42 | 显示全部楼层
冷回清风暖 发表于 2020-3-3 13:19
最近一直在钻研指针 哈哈哈  C语言的精髓在指针

指针这个东西真的是太骚了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 12:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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