0

この C プログラムは、キーボードから 1 行のテキストを読み取り、その行で最も長い単語を書き込みます。以下の私のコードの問題は、すべてが問題ないように見えますが、その長さとは別に最後の単語のみを出力することです。私のコードに問題がある人はいますか?

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

#define MAX 132
#define MAXW 30

int Len_w[MAXW];
int Max_V(int vf[], int len);

main()
{
    char s[MAX+1], w[MAXW], *Ind_w[MAXW],*p,out[MAXW];
    int k=0, i=0, Maximum, g=0;
    printf("\nInsert the line....\n");
    p=fgets(s, MAX, stdin);

    while(sscanf(p, "%s%n", w, &k)==1){
        Len_w[i] = strlen(w);
        Ind_w[i] = w; //the issue is here!!
        p+=k+1;
        i++;
    }
    Maximum = Max_V(Len_w,i);

    for(g=0;g<i;g++){
        if(Len_w[g] == Maximum){
                //sscanf(Ind_w[g],"%s",out);
                printf("\n%s", Ind_w[g]);


            }
    }

    return 0;
}

/*----------------------------------------------------------------------------*/
int Max_V(int vf[], int len)
{
  int j; int Max;
  Max=*vf;

  for(j=1; j < len; j++)
  {
     if(*(vf+j) > Max)
     {
         Max=*(vf + j);
     }
  }

  return Max;
}
/*----------------------------------------------------------------------------*/
4

2 に答える 2

5
Ind_w[i] = w;//the issue is here!!

Ind_w入力された単語ごとに上書きされる同じバッファーを指すすべてのポインターを許可します。そのため、最後に入力された単語のみが「表示」されたままになります。

あなたがそれを持っているなら、

Ind_w[i] = strdup(w);

は簡単な解決策です。さもないと

Ind_w[i] = malloc(strlen(w)+1);
strcpy(Ind_w[i], w);

どちらの方法でも、ポイント先のメモリが使用されなくなったときに解放する必要があります。

于 2013-01-03T16:00:17.313 に答える
2
Ind_w[i] = strdup(w);//the issue is here!!

wバッファを読み取るたびにバッファを複製する必要があり、すべての読み取りに同じバッファを使用しないでください。あなたが行った方法では、すべての配列要素が同じバッファーを指し、このバッファーには、最後に読み取られた同じ文字列が含まれていますsscanf

注:free複製されたバッファーが役に立たなくなったら、それらをすべて複製する必要があります。ポインターの配列を調べて、各要素(ポインター)を解放することでそれを行うことができます

于 2013-01-03T16:01:38.773 に答える