為什麼只能用gets()消回車符

如兩個圖片所示
我先用getch()嘗試消回車但不行
只有使用get()消回車才可以,為什麼

img

img

根据参考链接,getch不是从缓冲区读取字符,而是直接接收当前输入的字符,所以第一个图片中的代码,当执行到getch()这一行时,当前输入任意字符,都会被它接收,然后后面的gets(name)就读取了缓冲区留下的换行,然后就显示图片中的结果了;

而gets()可以从缓冲区读取一个字符串,直到遇到换行符,所以它可以将前面输入遗留在缓冲区的多余字符读走;使用getchar()循环读取字符,直到换行符为止也可以。

测试如下:

参考链接:


getch()_百度百科 getch()是编程中所用的函数,这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! https://baike.baidu.com/item/getch%28%29/10996394

C 库函数 – gets() | 菜鸟教程 C 库函数 - gets() C 标准库 - <stdio.h> 描述 C 库函数 char *gets(char *str) 从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。 声明 下面是 gets() 函数的声明。 char *gets(char *str) 参数 str -- 这是指向一个字符数组的指针.. https://www.runoob.com/cprogramming/c-function-gets.html

gets函数,C语言gets函数详解 在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。该函数的原型为: # include stdio.h char *gets(char *str); 这个函数很简单,只有一个参数。参数类型为 http://c.biancheng.net/view/233.html



#include <stdio.h> 
#include <stdlib.h>
#include <conio.h>
#include <string.h>


int main(void){
    
    
    int i,j,sum=0;
    int a[5][6]={{1,2,3,4,5,6},{2,3,4,5,6,7},{3,4,5,6,6,8},{4,5,6,7,8,0},{5,6,7,8,9,0}};
    for(i=0;i<4;i++){
        for(j=0;j<=5;j++){
            printf("a[%d][%d]=%d , ",i,j,a[i][j]);
            sum = sum+a[i][j];
        }
        printf("\n");
    }
    
    printf("\n===陣列 a 的總和為 : %d \n\n",sum);
    int num[3];  // 如果要存儲一個整數到下標為2的數組位置,需要定義數組最少3個元素,否則會數組越界 
    printf("輸入陣列初值:");
    scanf("%d",&num[2]);
    printf("num[2]=%d\n",num[2]);
    
    char name[100];
    printf("輸入你的名字:");
    
    //getchar();
    
    // https://blog.csdn.net/m0_65601072/article/details/124651590
    // https://baike.baidu.com/item/getch%28%29/10996394
    //    getch();
    
    // https://www.runoob.com/cprogramming/c-function-gets.html
    // http://c.biancheng.net/view/233.html
    gets(name);
    
    gets(name);
    printf("你的名字:%s\n",name);
    int str_num = strlen(name);
    printf("輸入幾個字元:%d\n",str_num);
    
    system("pause");
    
    return 0; 
    
} 

img

回车换行 2个字符 \r\n

用 getchar();试试。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    回答:

    在C语言中,gets()函数用于读取用户输入的一行字符串,并且这个函数会自动去掉结尾的换行符\n。而getch()函数用于从控制台读取单个字符,它并不会去掉结尾的换行符。

    这就是为什么使用gets()函数可以成功消除回车符,而使用getch()函数无法消除的原因。

    为了解决这个问题,可以在使用getch()函数后加入代码来手动消除回车符。具体的解决方案如下:

    #include <stdio.h>
    #include <conio.h>
    
    int main() {
        char ch;
    
        printf("请输入一个字符: ");
        ch = getch();
    
        // 使用getch()函数获得输入后,判断是否为回车符
        if (ch == '\r') {
            // 如果是回车符,再使用getch()函数获取一个字符
            ch = getch();
            // 如果获取到的字符也是回车符,则说明输入的只有一个回车符,需要再次获取
            if (ch == '\r') {
                ch = getch();
            }
        }
    
        printf("您输入的字符是: %c\n", ch);
    
        return 0;
    }
    

    这样就能达到消除回车符的效果。

    希望这个解决方案能够帮助到你。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^