[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
函数。
我的任务是编写一个函数,从用户那里获取输入字符串,将其标记为几个字符串,每个字符串包含输入句子中的一个单词,然后反转句子。结果将是句子输入,但单词顺序相反。
现在,我只有接受输入的函数,将其标记为单个单词,将这些单词存储到一个数组中,然后按顺序打印出每个单词。我还没有把写的字顺序颠倒的过程。
这是我目前处理的函数的代码:
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
函数。