最近在做一個小功能的時候,意外發現程序怎麼都執行不到目標處,附部分問題代碼,使用fgets輸入字符串後,在對比字符串時,怎麼都進不去if,我就納悶了,明明輸入的是quit,就是對比失敗。於是乎我專門花時間去找了一下資料,發現了fgets神坑的地方。
出現這個問題的原因是,從標準輸入獲取數據時,fgets()會比gets()多讀取一個換行符"\n",下面的代碼演示了這種差異以及解決方法:
/*
* 1.演示使用gets()和fgets()的區別
* 2.刪除用fgets輸入時多餘的換行符
*
* Created on: 2019年11月6日
* Author: xb
*/
#include<stdio.h>
#include<string.h>
#define QUIT "quit"
int main() {
char a[1024];
char* find; //查找換行符
bool isEnd = false;
while (!isEnd) {
printf("========使用gets輸入=============\n");
printf("input:");
gets(a);
printf("gets輸入的字符串長度:%d\n", strlen(a));
printf("待對比的字符串長度:%d\n", strlen(QUIT));
printf("strcmp(a,b):%d\n", strcmp(a, QUIT));
printf("\n");
printf("========使用fgets輸入=============\n");
printf("input:");
fgets(a, sizeof(a), stdin);
printf("去除換行符之前,fgets輸入的字符串長度:%d\n", strlen(a));
//刪除fgets取到的字符串末尾的換行符
//查找換行符,替換爲空字符
find = strchr(a, '\n'); //strchr():在一個串中查找給定字符的第一個匹配之處
if (find) {
*find = '\0';
}
printf("去掉換行符之後,fgets輸入的字符串長度:%d\n", strlen(a));
printf("待對比的字符串長度:%d\n", strlen(QUIT));
printf("strcmp(a,b):%d\n", strcmp(a, QUIT));
printf("\n");
if (strcmp(a, QUIT) == 0) {
printf("程序退出...\n");
//exit(0);
isEnd = true;
}
}
return 0;
}
使用g++編譯運行後,程序輸出:
終於找出問題所在,記錄下來分享給大家,少走坑!