[C]:使用 strcpy() 对字符串数组进行分段错误



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

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

以下是我到目前为止处理的函数的代码:

void reverse(void){
printf("nn%sn", "Reverse words in String: ");
char input[200];
printf("n%s", "Enter stringn> ");
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("nn");
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函数。

相关内容

  • 没有找到相关文章