淺談使用C庫函數之gets和fgets遇到的坑——字符串長度多出來的1是哪來的

最近在做一個小功能的時候,意外發現程序怎麼都執行不到目標處,附部分問題代碼,使用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++編譯運行後,程序輸出:

終於找出問題所在,記錄下來分享給大家,少走坑!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章