簡體   English   中英

嘗試通過指針數組從二維數組打印字符串時出現分段錯誤

[英]Segmentation fault when trying to print strings from 2D array via array of pointers

編輯:

因此,對於遇到相同問題的任何人,似乎盡管將指針數組初始化為 NULL,但該數組中仍然寫入了一些垃圾。 我通過將最后一個 while 語句(在函數打印機中)的標題替換為以下內容來修復分段:

while( (wordPtr[ctr] != NULL) && (ctr < MAX_WORDS) )

原問題:

該程序的第一個函數應該是獲取一些文本並用文本中的單詞填充一個二維字符串數組,但每個單詞只能出現一次。 然后,它必須用單詞的地址填充指向字符串的二維指針數組,這樣第二個函數就可以使用這些指針按照原來的順序重新打印文本。

我面臨的問題是,雖然字符串數組似乎按應有的方式填充,但每當我嘗試使用指針數組打印文本時,我都會遇到分段錯誤。

我認為問題出在我將指針指向單詞的行中的某處,但除此之外我找不到太多。

我嘗試使用 gdb,但結果指向 strlen.s,這是我在代碼中任何地方都沒有使用過的函數。

提前致謝。

代碼:


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


#define MAX_WORDS 6
#define MAX_WORD_LEN 10

void placer(char wordsArray[MAX_WORDS][MAX_WORD_LEN], char *ptr[MAX_WORDS][2]);
void printer(char *wordPtr[][2], int linelen);

int main (int argc, char *argv[]){
     char wordArray[MAX_WORDS][MAX_WORD_LEN] = {{ '\0' }};
     char *wordPtr[MAX_WORDS][2] = {{ NULL }};
     int linelen = 100;
     
     placer(wordArray, wordPtr); 
     printer(wordPtr, linelen);
     
     return 0;
}

void placer(char wordsArray[][MAX_WORD_LEN], char *ptr[][2]){
    
    int i, j, k, temp, w = 0, g = 0;
    char check[MAX_WORD_LEN] = {'\0'};
    for (i = 0; i < MAX_WORDS; i++) {
        
        scanf("%s", wordsArray[i]);
        
        //Converts to lowercase
        for (j = 0; j < MAX_WORD_LEN; j++) {
            if(isupper(wordsArray[i][j])) {
                wordsArray[i][j] = tolower(wordsArray[i][j]);
            }
        }
        
        //assigns to pointer array
        ptr[w][0] = &wordsArray[i][0];
        
        //Checks if word already exists in array
        for(k = 0; k < i; k++) {
            if(strcmp(wordsArray[i], wordsArray[k]) == 0) {
                //Directs pointer to the already existing instance of the word
                ptr[w][0] = &wordsArray[k][0];
                //replaces the word with \0
                for (g = 0; g < MAX_WORD_LEN; g++) {
                    wordsArray[i][g] = '\0';
                }
                i--;
                break;
            }
        }
        w++;
    }
    
    //prints from array of unique words
    printf("%s\n\n\n", &wordsArray[1][0]);
    for(temp = 0; temp < MAX_WORDS; temp++) {
        printf("%s\n", wordsArray[temp]);
    }
    
    printf("\n##\n");
}

void printer(char *wordPtr[][2], int linelen) {
    
    int ctr = 0, t;
        
    //prints using pointers
    while (wordPtr[ctr] != NULL) {
        printf("%s", *wordPtr[ctr]);
        ctr++;
    }
}

這是學習使用調試器的絕好機會。 您的系統幾乎肯定會提供一種以某種方式運行代碼的方法,以便您可以單步執行源代碼、查看任意點的變量值、放置斷點等。

通過這樣做,您可以檢查程序實際執行的操作與您期望它執行的操作。 這種類型的大多數問題很容易通過單步執行來診斷。 每個調試器(至少)都有一個小的學習曲線,但是學習基礎知識是非常值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM