2013-08-04 27 views
0

我遇到了這個for循環的麻煩,我不明白爲什麼它崩潰。我試圖以「名字姓氏」格式讀取20個名字的輸入列表,並將它們存儲爲「姓氏,名字」中的字符串。不應將重複項存儲到數組指針中。不明白爲什麼C程序崩潰,字符串指針數組

當我註釋掉malloc和比較循環時,顯然有一些地址保持不變的問題,所以* ary返回與* walker相同的值。 filePtr的工作原理和strcpy和strcat函數沒有問題。此外,刪除第一個printf也會導致程序崩潰,即使刪除它似乎也不應該有除輸出外的任何實際效果。

FILE *filePtr = fopen ("input.txt","r"); 
int size = 20; 
char **ary; 
char **walker; 
char **end; 
int strsize = 0; 
char firstname[30] = {0}; 
char lastname[30] = {0}; 
char *fullname; 
ary = calloc (size, sizeof(char *)); 
printf("%d\n",sizeof(pAry)); 
for (walker = ary ; *walker < (*end = *ary + size) ; walker++) 
{ 
    fscanf(filePtr," %s",firstname); 
    fscanf(filePtr," %[^\n]",lastname); 
    strsize = strlen(firstname) + strlen(lastname) + 3; 
    fullname = malloc (strsize * sizeof(char)); 
    strcpy(fullname,lastname); 
    strcat(fullname,", "); 
    strcat(fullname,firstname); 
    for (compare = 0 ; compare < walker ; compare++) 
    { 
     if(strcmp(fullname,*(ary + compare)) != 0) 
     { 
      diff = 0; 
     } 
    } 
    if (diff) 
    { 
     strncpy(*walker,fullname,strsize); 
     printf("%s\n",*walker); 
    } 
    free(fullname); 
} 
+1

究竟是布爾條件在這裏:'*沃克<(*結束= *元+大小)'? – Oleksiy

+0

@OleksiyDobrodum它應該檢查walker字符串是否已經到達數組的末尾 – user2649387

+2

這裏有一個提示:什麼是C中的相等運算符?什麼是賦值運算符? –

回答

1

外環應遍歷的ary所有條目,所以結束條件應walker測試是(在)的end

這裏不再提領:

for (walker = ary; walker < (end = ary + size); walker++) 

的重複也比較againt絕對指針值的測試循環中,compare0初始化意味着相對comparsion所以這行

compare < walker; 

應該是

compare < (walker - ary); 

抽取兩個指針會返回一個整數,其大小取決於指針的大小,這取決於編譯器和/或系統。爲了避開這種不確定性,已經引入整數類型ptrdiff_t以保證保持指針差異。

所以compare應聲明:

ptrdiff_t compare; 

strcmp()回到0如果要比較兩個字符串相等,不平等所以設置diff0是錯誤的。

你可能想用下面的語句來設置diff

diff = strcmp(fullname,*(ary + compare)); 

這臺diff0(假)如果兩個字符串相等(沒有* *差異erent)。

同樣的比較應該在找到一個重複之後停止。

if (!diff) 
    { 
     break; 
    } 

最後diff需要(重新)初始化每次迭代。


而不是

strncpy(*walker, fullname, strsize); 

*walker = fullname; 

fullname referrs到新分配的內存,需要存儲,爲下一次迭代覆蓋。

free()荷蘭國際集團fullname

free(fullname); 

需要被然後取出。


把所有這一切在一起你會得到:

... 

for (walker = ary; walker < (end = ary + size); walker++) 
{ 
    ... 

    { 
    int diff = 1; 
    for (ptrdiff_t compare = 0; compare < (walker - ary); compare++) 
    { 
     diff = strcmp(fullname, *(ary + compare));  
     if (!diff) 
     { 
     break; 
     } 
    } 

    if (diff) 
    { 
     *walker = fullname; 
     printf("%s\n", *walker); 
    } 
    } 
}