[C]:使用 strcpy() 到字符串数组中的分段错误

[C]: Segmentation fault using strcpy() into String Arrays

我的任务是编写一个函数,从用户那里获取输入字符串,将其标记为几个字符串,每个字符串包含输入句子中的一个单词,然后反转句子。结果将是句子输入,但单词顺序相反。

现在,我只有接受输入的函数,将其标记为单个单词,将这些单词存储到一个数组中,然后按顺序打印出每个单词。我还没有把写的字顺序颠倒的过程。

这是我目前处理的函数的代码:

void reverse(void){
printf("\n\n%s\n", "Reverse words in String: ");

char input[200];
printf("\n%s", "Enter string\n> ");
scanf("%s", &input);

char reverseSentence[200];
char sentenceParts[20][200];
int wordCount = 0;

char *thisWord = strtok(input, " ");
strcpy(sentenceParts[wordCount], thisWord);
wordCount++;


while(thisWord != NULL){
    thisWord  = strtok(NULL, " ");
    strcpy(sentenceParts[wordCount], thisWord);
    wordCount++;
}

printf("\n\n");

for(int i = 0; i < wordCount + 1; ++i){
    printf("%s%s", sentenceParts[i], " ");
}
}

问题出在while语句上:

while(thisWord != NULL){
    thisWord  = strtok(NULL, " ");
    strcpy(sentenceParts[wordCount], thisWord);
    wordCount++;
}

程序退出并在 strcpy 语句处出现分段错误。我无法理解我为什么要这样做。它似乎在 while 循环之外工作得很好。

有什么想法吗?我已经坚持了很长时间,找不到太多其他资源可以提供帮助。

使用下一个标记更新 thisWord 应该发生在循环体的末尾。按照原样,您最终将使用 NULL 更新 thisWord,然后使用 NULL 调用 strcpy。那是你的段错误。

所以循环应该是这样的:

char *thisWord = strtok(input, " ");
while(thisWord != NULL){
    strcpy(sentenceParts[wordCount], thisWord);
    wordCount++;
    thisWord  = strtok(NULL, " ");
}

另一个问题(@WhozCraig 在评论中指出)是您正在使用 scanf("%s", ...) 输入行。这不起作用,因为 scanf 将在第一个空白字符处停止。因此,您一次只能从 scanf 中获得一个词。要获取整行,请使用 fgets 函数。