You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C-string功能测试程序无法获取第二个字符串输入的修正方案

问题分析与解决方案

问题原因

第一个cin.get(a,100)读取完用户输入的字符串后,输入缓冲区中会残留一个换行符(用户按下回车确认输入时产生)。当第二个cin.get(bstring,50)执行时,它会直接读取到这个换行符,认为输入已结束,因此不会等待用户输入新内容。

解决方案

在两次cin.get()调用之间,添加代码清除输入缓冲区中的残留换行符,以下是两种常用方式:

  • 方式一:使用cin.ignore()
    调用cin.ignore(numeric_limits<streamsize>::max(), '\n'),它会跳过缓冲区中直到换行符的所有字符(包括换行符本身),需要包含<limits>头文件。

  • 方式二:使用额外的cin.get()
    单独调用一次cin.get()读取残留的换行符,这种方式简洁,但仅适用于缓冲区中只有单个换行符的场景。

修正后的完整代码

#include<iostream>
#include<cstring>
#include<limits> // 用于numeric_limits
using namespace std;

int main(){
    char a[100];
    char bstring[50]="how are you\n";
    char c[100];
     
    cout<<"input string 1\n";
    cin.get(a,100);
     
    // 清除输入缓冲区的残留换行符
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
     
    cout<<"input string 2\n";
    cin.get(bstring,50);
           
    strcpy(c,a);
    cout<<" after cpy a into c \n"<<c;
         
    strcat(a,bstring);
    cout<<"  after cat b into a  \n"<<a;
         
    cout<<"length of a  \n"<<sizeof(a);
         
    int cmp_result = strcmp(a,bstring);
    if(cmp_result < 0){
        cout<<"str1 is smaller \n";
    }else if(cmp_result == 0){
        cout<<"both are equal \n";
    }else{
        cout<<"str1 is greater \n";
    }
    return 0;        
}

注:原代码中strcmp的返回值判断做了优化——标准库中strcmp仅保证返回负数、0、正数分别表示小于、等于、大于,并非固定返回-1或1,直接判断正负更严谨。

内容的提问来源于stack exchange,提问作者Bilal Sahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:42:21