【发布时间】: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 < i; k++) {if(strcmp(wordsArray[i], wordsArray[k]) == 0) {} -
致WhozCraig,这个程序以后有更多的功能并且是家庭作业,所以我没有太多的代码更改空间。基本上都是以某种方式布局的。
-
对于 RobertS,您有什么建议可以替代 strcmp?
-
@mltsd 不是替换它,而是将数组索引号排除在游戏之外。或者它是否实现了某种目的?但正如我所说,我不确定这是否会导致这个问题。
标签: c string pointers multidimensional-array