strcmp関数がうまく動作しない。。。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ピーちゃん

strcmp関数がうまく動作しない。。。

#1

投稿記事 by ピーちゃん » 8年前

fopenで取得した文字列を比較するために、strcmp関数を使用しています。
私の眼には一致しているのですが、関数としてはどうも不一致と判定しているようです。

test.txt
1行目:GAMEPARAM
2行目:NONE

①このtest.txtの1行目(GAMEPARAM)の文字列をfopenで取得する。
②文字列が一致したら"一致"と表示。
③文字列が不一致なら"不一致"と表示。

流れはこのような形です。

コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define	STRNUM	256				//読み書き文字列数
#define	STRINI	"GAMEPARAM"		//1行目の文字列

int main(void)
{
	//ローカル変数定義
	FILE	*p_file;					//ファイルオープン
	char	*fileName = "test.txt";		//オープンするファイル
	int		ret = 0;					//関数の戻り値
	char	fileString[STRNUM];			//ファイル読み書き
	
	//変数の初期化
	strcpy(fileString, "");

	p_file = fopen(fileName, "r");		//ファイルを読み込みモードでオープン
	if(p_file == NULL)					//ファイルを読み込める状態でなければ
	{
		return 0;						//閉じる
	}

	fgets(fileString, STRNUM, p_file);	//1行目を読み込む
	fclose(p_file);

	printf("%s",fileString);		//※ここでは「GAMEPARAM」と表示される。
	if(strcmp(fileString, "GAMEPARAM"))
	{
		printf("不一致 %d",strcmp(fileString, "GAMEPARAM")); //※ここでは「1」と表示される。
	}
	else
	{
		printf("一致 %d",strcmp(fileString, fileString));   //※ここでは「0」と表示される。
	}

    return 0;
}
「※」のコメントはそこを通った時の値を書いています。
これを実行すると、どうしても不一致側を表示してしまいます。
念のために、STRINIを「GAMEPARAM\0」とNULL文字を入れたものにしてみましたが、だめでした。
どこがおかしいのでしょうか。。。?

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: strcmp関数がうまく動作しない。。。

#2

投稿記事 by YuO » 8年前

fgetsは領域が足りている場合,行末の改行\nまでバッファにコピーします。
比較対象には\nが含まれませんから,当然文字列は一致しません。

28行目を

コード:

printf("[[%s]]\n", fileString);
のようにしてみると,]]が次の行に表示されると思います(=fileStringの末尾に改行文字が含まれている)。

対処としては,fileStringの末尾の改行文字を\0に置き換えるか,比較対象の文字列に\nを加えておくか,となるかと思います。

box
記事: 2002
登録日時: 13年前

Re: strcmp関数がうまく動作しない。。。

#3

投稿記事 by box » 8年前

ピーちゃん さんが書きました:

コード:

	fgets(fileString, STRNUM, p_file);	//1行目を読み込む
fgets関数でファイルを読んだとき、末尾の改行コード'\n'もデータに含みます。
つまり、この時点のfileStringの中身は
GAMEPARAM\n\0
です。これを
GAMEPARAM\0
と比較しているのですから、当然不一致です。

末尾の改行を取り除くためのよくある手は
fileString[strlen(fileString) - 1] = '\0';
最後に編集したユーザー box on 2015年11月23日(月) 22:27 [ 編集 2 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: strcmp関数がうまく動作しない。。。

#4

投稿記事 by みけCAT » 8年前

fgetsで読み込んだ改行文字を含めて比較しようとしているのではないでしょうか?

コード:

fgets(fileString, STRNUM, p_file);  //1行目を読み込む
の直後に

コード:

{char *lf = strchr(fileString, '\n'); if (lf != NULL) *lf = '\0';} // 改行文字があったら消す
という処理を追加してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ピーちゃん

Re: strcmp関数がうまく動作しない。。。

#5

投稿記事 by ピーちゃん » 8年前

トピ主です。

なるほど、そういうことでしたか。
確かに

コード:

#define	STRINI	"GAMEPARAM\n"
としたら一致してくれました。
改行やNULL文字はメモ帳だと何も見えないので見落としてしまいますね。。。

fopenの仕様も再認識しました。

助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る