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
相关产品推荐
相关产品推荐

