2013-01-03 45 views
0

該C程序從鍵盤讀取一行文本,然後將最長的單詞寫入該行。我的代碼下面的問題是,它只打印最後一個字,除了它的長度,儘管一切似乎都很好。任何人都可以看到我的代碼有問題嗎?C代碼中的字符串指針問題

#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; 
} 
/*----------------------------------------------------------------------------*/ 
+5

指針算術很有趣,但是常規索引往往會使這樣的代碼更具可讀性。 – StoryTeller

回答

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); 

兩種方式都需要它時不再使用被釋放指向的內存。

+1

請記住;之後,你必須自己釋放由'strdup'或'malloc'分配的內存。 – Lynn

+0

好點。補充,謝謝。 –

+0

我可以通過電子郵件詢問與此事有關的事嗎 –

2
Ind_w[i] = strdup(w);//the issue is here!! 

你要複製每次讀取緩衝區,而不是使用相同的緩衝區所有的閱讀時間w緩衝。用你的方式,你將有全部指向同一個緩衝區中的數組元素,並且該緩衝區包含這是最後一個讀與sscanf

注相同的字符串:你必須free所有的重複時的緩衝區他們來無用。你可以通過遍歷指針數組並釋放每個元素(指針)