C语言scanf()输入字符缓存输入换行符处理 gets()方法无法输入字符串问题 附案例和代码

文章讲述了在使用C语言编程时,作者在处理谭浩强第五版教材课后题中的字符串输入时遇到的问题,主要涉及到scanf和gets函数的使用,以及如何正确处理换行符。通过实例分析,作者发现scanf在读取空格和回车时的问题,并提出使用scanf配合消化换行符的解决方案。
摘要由CSDN通过智能技术生成

这是很简单的一个题目,谭浩强c语言第五版第八章课后题

如下是我的代码

#include <stdio.h>
int main(){
    void copy(char *str1,char *str2,int n,int m);
    char str1[50];
    char str2[50];
    int m,n=0;
    printf("please enter n");
    scanf("%d",&n);
    printf("please enter m");
    scanf("%d",&m);
    for (int i = 0; i < n; ++i) {
        scanf("%c",&str1[i]);
    }
    copy(str1,str2,n,m);
    puts(str2);
}
void copy(char *str1,char *str2,int n,int m){
    for (int i = m-1; i < n; ++i) {
        *(str2+i-m+1)=*(str1+i);
    }
    str2[n-m+1]='\0';
}

运行后却发现得到了如上的结果,经过debug发现问题是:在输入m后的 回车键 在缓存中被scanf%c 读取进数组str1作为了str【0】

修改输

入语句为:scanf("%s",str1); 解决

#include <stdio.h>
int main(){
    void copy(char *str1,char *str2,int n,int m);
    char str1[50];
    char str2[50];
    int m,n=0;
    printf("please enter n");
    scanf("%d",&n);
    printf("please enter m");
    scanf("%d",&m);
        scanf("%s",str1);
    copy(str1,str2,n,m);
    puts(str2);
}
void copy(char *str1,char *str2,int n,int m){
    for (int i = m-1; i < n; ++i) {
        *(str2+i-m+1)=*(str1+i);
    }
    str2[n-m+1]='\0';
}

 或者吞掉\n 加上一行即可

scanf("%d",&m);
    scanf("%c",&str1[0]);
    for (int i = 0; i < n; ++i) {
        scanf("%c",&str1[i]);
    }

总结:用%c输入时不论键盘敲击什么进去都会按顺序读写进去(空格 回车)

下面尝试用gets方法输入:

直接输入 发现错误,控制台直接跳过gets()方法,显示如下:

 

经过排查原因:输入m后的空格被gets()方法直接读取进去 

printf("please enter m");
    scanf("%d",&m);
    scanf("%c",&str1[0]);
//    for (int i = 0; i < n; ++i) {
//        scanf("%c",&str1[i]);
//    }
    gets(str1);

加上一行scanf(%c)消化\n后 解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值