1

に問題がありfgetsます。文字列 "temp" を if ステートメントに保存できません。

コード:

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include<stdlib.h>
      4 
      5 void moep(char** tmp){
      6         FILE *fp;
      7         fp=fopen("moep", "r");
      8         int line_num = 1;
      9         int find_result = 0;
     10         char* str="jochen";
     11         char temp[512];
     12 
     13 while(fgets(temp, 512, fp) != NULL) {
     14                 if((strstr(temp, str)) != NULL) {
     15                         printf("A match found on line: %d    \n", line_num);
     16                         tmp[find_result]=temp;
     17                         printf("\n%s\n", tmp[find_result]    );
     18                         find_result++;
     19                 }
     20                 line_num++;
     21         }
     22 fclose(fp);
     23 printf("tmp[0]:%s\n",tmp[0]);
     24 tmp[1]="ich funktioniere";
     25 }
     26 
     27 int main(){
     28 
     29         char* tmp[1];
     30         moep(tmp);
     31         printf("%s, %s\n",tmp[0],tmp[1]);
     32         return 0;
     33 }

moep は次のとおりです。

unwichtig1
jochen g
unwichtig2
unwichtig3

出力:

/一致する行が見つかりました: 2

ヨッヘン・グ

tmp[0]:unwichtig3

���, ich funktioniere


「jochen」を に保存できないのはなぜtmp[0]ですか?

4

3 に答える 3

1

tmp[1] への割り当ては、配列がそれほど大きくないため、ランダム メモリへの割り当てです。プログラムのクラッシュを含む、あらゆる種類の悪い副作用があります。

temp[] 配列も再利用しているため、上書きされ続けるため、保持したい場合は文字列をコピーする必要があります。

于 2012-10-15T18:42:46.887 に答える
0

いくつかの問題があります。私はまったく見ませんでしmoep()main()

おそらく、次のように宣言するつもりはありませんでしたtmp

 char* tmp[1];

これはポインターを宣言しますが、どこも指していません。その中の 2 番目の要素へのアクセスは、1 つの要素であると宣言されているため、「コーシャ」ではありません。(ただし、配列が割り当てられていないため問題ありません。)

おそらくあなたが意味した

 char  tmp[2];

これにより、2 文字分のスペースが割り当てられます。

于 2012-10-15T18:42:48.963 に答える
0

少し混乱しています。

tempchar へのポインターの配列です。temp へのポインターをその配列の最初、2 番目などの要素に割り当てます。tempつまり、それ自体は変更されず、ループの反復ごとに内容が上書きされるため、これは常に同じ値です。

strncpy()ある文字列から別の文字列にコピーするために使用します。

于 2012-10-15T18:43:38.057 に答える