ページ 11

C++ 文字列の比較ができません。

Posted: 2012年11月16日(金) 19:56
by テマリ
C言語で文字入力式の問題を作ろうとしていたんですけど

コード:

if("%s", s==nans)
の文字列と文字列の比較が合いません。
どうして比較が合わないのか教えて頂きたいです。
よろしくお願いします。

コード:

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

#define MBF 1024

int main(void){
	FILE *fp; //ファイルポインタの宣言
	char s[MBF];
	char nans[100];
	char kans[100];
	int nqst;
	int nhit;
	int nln;
	nqst = nhit = nln = 0 ;
	fp = fopen("textj.txt","r");

	while(fgets(s, MBF, fp) != NULL){
		switch(nln%3+1){
			case 1:
				printf("問題:%s", s);
				break;
			case 2:
				printf("%s", s);
				scanf("%[^\n]",&nans);
				printf("%s\n",nans);
				break;
			case 3:
				nqst++;
				printf("%s\n", s);
				if("%s", s==nans){
					printf("正解\n");
				}else{
					printf("不正解\n");
				}

				break;
		}
		nln++;
	}

	fclose(fp); //ファイルクローズ

	return 0;

}

textj.txt
________
ライブラリ初期化
例答を書け
DxLib Init
__________


実行結果_____
問題:ライブラリ初期化
例答を書け
DxLib Init
DxLib Init
DxLib Init
不正解
続行するには何かキーを押してください . . .

Re: C++ 文字列の比較ができません。

Posted: 2012年11月16日(金) 20:18
by Dixq (管理人)
if("%s", s==nans){
は、条件文の書き方が正しくないです。

strcmpを使ってください。
http://www.google.co.jp/search?q=strcmp ... e&ie=UTF-8

sが示すものは、s配列の先頭アドレスです。
nansが示すものも、同様にnans配列の先頭アドレスです。

データが格納されている場所と場所を比較しているので、異なる結果となります。
文字列が同じであるかどうかは、実際には配列要素を一つ一つ同じかどうか確認する必要があるのです(それをする関数がstrcmpです)

Re: C++ 文字列の比較ができません。

Posted: 2012年11月16日(金) 21:31
by box
if文の書き方がおかしいのは管理人さんからのご指摘に従うとして…。
テマリ さんが書きました:

コード:

	fp = fopen("textj.txt","r");
何らかの原因でファイルが正しくオープンできなかった場合でも
強引にプログラムの実行を続けようとするのはまずいような気がします。
テマリ さんが書きました:

コード:

		switch(nln%3+1){
わざわざ+1してcase 1~case 3で分岐させなくても、
+1をやめてcase 0~case 2で十分であるような気がします。
+1することに何か大きな意味があるのであれば、話は別です。
テマリ さんが書きました:

コード:

				scanf("%[^\n]",&nans);
& は余分であるような気がしないでもありません。

Re: C++ 文字列の比較ができません。

Posted: 2012年11月16日(金) 22:23
by テマリ
返信ありがとうございます。
形にはなりましたが2問目から

コード:

scanf("%[^\n]",nans);	//解答入力
が無視されてしまいます。どうして無視されてしまうのか教えて頂きたいです。
よろしくお願いします。 下記が現在コードとテキストファイルです。

コード:

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

#define MBF 1024

int main(void){
	FILE *fp; //ファイルポインタの宣言
	char* p;
	char s[MBF];
	char nans[100];
	char kans[100];
	int nqst;
	int nhit;
	int nln;
	char yn[4];
	nqst = nhit = nln = 0 ;

	if((fp = fopen("textj.txt","r")) == NULL){ //ファイルオープン
		printf("file open error!!\n");
		exit(EXIT_FAILURE);//エラー時は異常終了
	}

	while(fgets(s, MBF, fp) != NULL){
		p = strchr( s,'\n');	//改行文字があるか検索
		if(p!=NULL){	//改行文字があった場合
			*p = '\0';	//改行文字を終端文字に置き換える
		}
		switch(nln%3){
			case 0:
				printf("問題:%s\n", s);
				break;
			case 1:
				printf("%s\n", s);
				scanf("%[^\n]",nans);	//解答入力
				break;
			case 2:
				nqst++;
				printf("strcmp(%s, %s) = %d\n", s, nans, strcmp(s, nans));
				if((strcmp(s,nans))==0){
					printf("正解→");
					nhit++;
				}else{
					printf("不正解→");
				}
				printf("正解率は%d/%dです\n",nhit,nqst);
				printf("現在%d問目です、続けますか?(y/n)>",nqst);
				scanf("%s",yn);
		}
		nln++;
		if(*yn=='n')break;
	}
	fclose(fp); //ファイルクローズ
	return 0;
}
textj.txt___________
ライブラリ初期化
例答を書け
DxLib Init
ライブラリ使用の終了関数
例答を書け
DxLib End


実行結果____________
問題:ライブラリ初期化
例答を書け
DxLib Init
strcmp(DxLib Init, DxLib Init) = 0
正解→正解率は1/1です
現在1問目です、続けますか?(y/n)>y
問題:ライブラリ使用の終了関数
例答を書け
strcmp(DxLib End, DxLib Init) = -1
不正解→正解率は1/2です
現在2問目です、続けますか?(y/n)>n
続行するには何かキーを押してください . . .

Re: C++ 文字列の比較ができません。

Posted: 2012年11月16日(金) 22:40
by box
テマリ さんが書きました:

コード:

		if(*yn=='n')break;
最も安直な(他にもっといい答えがあるかもしれない)回答は

コード:

		if(*yn=='n')break;
		rewind(stdin);

Re: C++ 文字列の比較ができません。

Posted: 2012年11月16日(金) 23:37
by テマリ
やっと使えるプログラムになりました。
良い助言ありがとうございました。

コード:

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

#define MBF 1024

int main(void){
	FILE *fp; //ファイルポインタの宣言
	char* p;
	char s[MBF];
	char nans[100];
	char kans[100];
	int nqst;
	int nhit;
	int nln;
	char yn[4];
	nqst = nhit = nln = 0 ;

	if((fp = fopen("textj.txt","r")) == NULL){ //ファイルオープン
		printf("file open error!!\n");
		exit(EXIT_FAILURE);//エラー時は異常終了
	}

	while(fgets(s, MBF, fp) != NULL){
		p = strchr( s,'\n');	//改行文字があるか検索
		if(p!=NULL){	//改行文字があった場合
			*p = '\0';	//改行文字を終端文字に置き換える
		}
		switch(nln%3){
			case 0:
				printf("問題:%s\n", s);
				break;
			case 1:
				printf("%s\n", s);
				scanf("%[^\n]",nans);	//解答入力
				break;
			case 2:
				nqst++;
				printf("strcmp(%s, %s) = %d\n", s, nans, strcmp(s, nans));
				if((strcmp(s,nans))==0){
					printf("正解→");
					nhit++;
				}else{
					printf("不正解→");
				}
				printf("正解率は%d/%dです\n",nhit,nqst);
				printf("現在%d問目です、続けますか?(y/n)>",nqst);
				scanf("%s",yn);
		}
		nln++;
		if(*yn=='n')break;
		rewind(stdin);
	}
	fclose(fp); //ファイルクローズ
	return 0;
}