2011-01-26 6 views
0

私は簡単な質問があります。私はC言語で特定のファイルの行をスキャンするプログラムを書いています。行の唯一のフレーズが "Atoms"ならば、スキャンを停止して、それがどの行にあるかを報告します。これは私が持っているもので、どうやら私はポインタに整数を比較してるので、コンパイルされていません:。特定の文字列が見つかるまでループする

:(「string.hの」もちろん含まれている

char dm; 
    int test; 
    test = fscanf(inp,"%s", &dm); 

    while (test != EOF) { 
    if (dm=="Amit") { 
     printf("Found \"Atoms\" on line %d", j); 
     break; 
    } 
    j++; 
    } 

ファイルが既にで開かれましたinp = fopen(..)

そして、それは正しく開くことを確認するためにチェック...

私も別のアプローチを使用したい、それが動作することができればと思いまして。代わりに、個々の文字列をスキャンするのは、私のように行全体をスキャン可能性そのようなもの:

// char tt[200]; 
// 
// fgets(tt, 200, inp); 

とような何か:

if (tt[] == "Atoms") break;

感謝を! Amit

答えて

2

ここで実際のコードにあまり注意を払わずに、==演算子は2つの文字列を比較しないという最も重要な間違いです。

Cでは、文字列は文字の配列であり、単なるポインタです。したがって、if( "abcde" == some_string)は、同じ文字列を指していない限り真ではありません!

"strcmp(char * a、char * b)"のようなメソッドを使いたい場合は、2つの文字列が等しい場合は0を、それ以外の場合は0を返します。 "strncmp(char * a、char * b、size_t n)"はaとbの最初の "n"文字を比較し、等しい場合は0を返します。これは文字列の先頭を見るのに適しています文字列が特定の文字セットで始まる場合)

また、fscanfの%sのポインタとして文字を渡すべきではありません!これはスタックを完全に破壊し、多くの文字をchに入れようとします。これは1文字のスペースしかありません! Jamesが言っているように、あなたはchar ch [BUFSIZE]のようなものをやりたがっています。ここでBUFSIZEは1つの行があると予想していますが、 "fscanf(inp、"%s "、ch)

希望に役立ちます!

+1

私はまだ他の回答にコメントできないようですが、私は下のJohnのアドバイスは良くないと指摘したいと思います。 fscanfがそこにデータを格納しようとする前に、ポインタを有効なメモリブロックに初期化する必要があります。ポインタがどこにでも向いているので、彼が下で与えたコードを呼び出すことは非常に危険です! –

+0

ありがとう@Kit。私はstrncmpを使い終わったので、私はあなたの答えを変えたのです。私はそれが私のケースの方がはるかに良いと思うし、私はこのstrncmp機能を知らなかった。再度、感謝します。 – Amit

+0

私は助けることができてうれしい!私の答えはすごく辛かったですが、できるだけたくさんの軽食を詰め込もうとしました。 –

0

問題は、あなたはまた、おそらくあなたがする必要があります、間違った行番号を報告しますchar、ないmallocさchar*またはchar[BUFSIZE]

http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

として「DM」と宣言しましたです'\ n'発生のために読み込みバッファをスキャンし、必要な文字列がバッファ境界を越えている場合を処理します。

1

あなたは

よりchar *型を必要としながら、DMは、単一文字であることに注意してください:if (dm=="Amit")が間違っている、関数fscanfを使ってラインで

if (strcmp(dm, "Amit") == 0) 
+0

'if(strcmp(dm、" Amit ")== 0)'より良いようです。 – tibur

+0

@tiburありがとう、 – Ass3mbler

+0

私は同意します。 strcmpは正しい関数です。真の比較のために「7」を返し、誤った比較のために負の数を返す理由はありますか?例えば、 'int test = strcmp(s1、s2)'という2つの同じ文字列を比較すると、test = 7を返し、それ以外の場合は負の数値を返す。 – Amit

1

でそれを変更し、文字列をcharのアドレスにキャストします。 %sの関数fscanf内のポインタではなく、アドレスに文字列を設定する必要が使用:

char *dm; 
test = fscanf(inp,"%s", dm); 

*記号は間接を宣言し、即ち、変数は、DMによって指さ。 fscanf行は、%s区切り文字でキャプチャされた文字列への参照としてdmを宣言します。文字列の最初の文字のアドレスを指します。

正しいキットは何ですか、strcmpコマンドを使用してください。==比較ではなく、==は文字列のアドレスを比較するだけです。

編集:以下のキットは正しいと言います。すべてのポインタは、それらが使用される前にメモリに割り当てられる必要があります。そうでなければ、事前に割り当てられたメモリ空間にキャストする必要があります。次のようにメモリを割り当てることができます。

dm = (char*)malloc(sizeof(char) * STRING_LENGTH); 

ここで、STRING_LENGTHは可能な文字列の最大長です。このメモリ割り当ては一度だけ行う必要があります。

+0

ここで提供しているコードは* VERY DANGEROUS *ですので使用しないでください。 Char * dmは初期化されていないポインタです。つまり、メモリ内の何かを指している可能性があります。 fscanfは文字列入力にメモリを割り当てません.dmが指すスペースにデータをコピーしようとします。最良の場合のシナリオでは、dmは無意味で空のメモリ領域を指すか、0x00000000(ほとんどのシステムではヌルポインタ)を指し、ヌルポインタ例外を引き起こします。 最悪の場合、fscanfがコードやその他の変数を文字列データで上書きする可能性があります。 –

+0

@Kit、あなたは正しいです、ありがとうございます。 –

関連する問題