【问题标题】:Segmentation fault when trying to print strings from 2D array via array of pointers尝试通过指针数组从二维数组打印字符串时出现分段错误
【发布时间】:2020-03-26 08:40:42
【问题描述】:

编辑:

因此,对于任何有同样问题的人来说,尽管将指针数组初始化为 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++;
    }
}

【问题讨论】:

  • 我认为在这段代码的 any 中没有理由使用 ptr。如果目标是不断提示并读取字符串,直到累积了 MAX_WORDS 唯一词,则此源中的 2D 指针数组似乎毫无意义。
  • 这可能是由于您在循环期间尝试在某些数组元素处使用strcmp()引起的。 for(k = 0; k &lt; i; k++) {if(strcmp(wordsArray[i], wordsArray[k]) == 0) {}
  • 致WhozCraig,这个程序以后有更多的功能并且是家庭作业,所以我没有太多的代码更改空间。基本上都是以某种方式布局的。
  • 对于 RobertS,您有什么建议可以替代 strcmp?
  • @mltsd 不是替换它,而是将数组索引号排除在游戏之外。或者它是否实现了某种目的?但正如我所说,我不确定这是否会导致这个问题。

标签: c string pointers multidimensional-array


【解决方案1】:

这是学习使用debugger 的绝佳机会。您的系统几乎肯定会提供一种运行代码的方式,以便您可以单步执行源代码、查看任意点的变量值、放置断点等。

通过这样做,您可以检查程序 实际 所做的与您期望的。这种类型的大多数问题很容易通过单步诊断。每个调试器(至少)都有一个小的学习曲线,但学习基础知识非常值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2021-03-25
    • 2015-04-13
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多