编辑:
因此,对于任何有相同问题的人来说,尽管初始化了指向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++;
}
}
最佳答案
这是学习使用debugger的绝佳机会。您的系统几乎可以肯定地提供了一种以某种方式运行代码的方法,因此您可以单步浏览源代码,在任何点查看变量的值,放置断点等。
这样,您可以检查程序实际执行的功能与预期的功能。通过单步很容易诊断出大多数此类问题。每个调试器(至少)都有一个很小的学习曲线,但是值得学习基础知识的工作。
关于c - 尝试通过指针数组从2D数组打印字符串时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59126987/