鱼C论坛

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

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

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

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

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

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

int main()
{
        int i , ch;
        printf("请输入一行英文句子:");
        while((ch = getchar())!='\n')//输入字符且并未按回车时进入循环
        {
            if (ch >= 'A' && ch <= 'Z')
                {
                        ch = ch + num;
                }
            else if('a' <= ch <= 'z')
            {
                ch = ch - 32;
            }
            putchar(ch);//输出单个字符
        }

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

main(void)
{
        char c                                         ;
        while((c = getch()) != '\r') {
                if (c < 32) c = 46                     ;
                else if (c >= 'A' && c <= 'Z') c += 32 ;
                else if (c >= 'a' && c <= 'z') c -= 32 ;
                putch(c)                               ;
        }
        printf("\n")                                   ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

字符串就是由一个一个字符组成的,用字符输出字符串是很正常的事情啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我想的是这个程序里面
他应该是,输入一个字符 输出一个结果
而不是输入全部字符之后 在输出结果
putchar 不是用来输出单个字符的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 20:47:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

循环上不是有注释吗
当输入的字符不为换行符时才进入循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

每输入一个字符 就进入循环
就会执行一次putchar函数
那么输入Y
输出结果不应该是 Yy吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main(void)
{
        initscr();
        int ch;
        while((ch = getch()) != 'q')
                printw("%c\n", ch);
        endwin();
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我用的win10 没有curse这个库
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 21:15:20 | 显示全部楼层
看注释
#include <stdio.h>
#define num 32;

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

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

使用道具 举报

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

vs  ?
dev++ ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

main(void)
{
        char c                                         ;
        while((c = getch()) != '\r') {
                if (c < 32) c = 46                     ;
                else if (c >= 'A' && c <= 'Z') c += 32 ;
                else if (c >= 'a' && c <= 'z') c -= 32 ;
                putch(c)                               ;
        }
        printf("\n")                                   ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

code::blocks
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

借你这个题目,做做!一起加油!
#include <stdio.h>
#include <malloc.h>
int main()
{
        int j=1024;
        char *c=(char *)malloc(j);
        int i=0;
        while (fgets(c,j,stdin))
        {
                for (i=0;*(c+i);i++)
                {
                        if (i==j-1) break;
                        else if (*(c+i) >=65 && *(c+i) <= 90) *(c+i)+=32;
                        else if (*(c+i) >=97 && *(c+i) <= 122) *(c+i)-=32;
                }
                printf("%sinput :",c);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哇 赞 我还没学到后面的动态内存分配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

指针是最难得!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

最近一直在钻研指针 哈哈哈  C语言的精髓在指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

指针这个东西真的是太骚了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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