gpt4 book ai didi

c - 我在第二个 if 循环中不断出现段错误 11,这是什么原因?

转载 作者:行者123 更新时间:2023-12-01 13:42:52 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来读取表单中的人名,名字后跟中间名和姓氏,或者只是姓氏。然后程序应将名称显示为姓氏后跟逗号,然后是名字的第一个字母后跟句点。输入示例:

John Smith

输出应该是

Smith J. 

另一个示例输入:

John David Smith

输出:

Smith D. J.

这是我写的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char space[2] = " ";

int main(){
char input[50], firstName[20], middleName[20], lastName[20], *token;
scanf("%[^\n]s", &input);
token = strtok(input, space);
strcpy(firstName, token);
if (token != NULL){
token = strtok(NULL, space);
strcpy(middleName, token);
}
if (token != NULL){
token = strtok(NULL, space);
strcpy(lastName, token);
printf("%s %c. %c.\n", lastName, middleName[0], firstName[0]);
}
else {
printf("%s", middleName);
printf("%s %c.\n", middleName, firstName[0]);
}
return 0;
}

当输入名称有中间名时,它会起作用,例如,如果我键入“John David Smith”,它将抛出“Smith D. J.”,但如果我键入“John Smith”,它将抛出段错误 11。 所以有什么问题?是因为我没有正确使用strtok吗?

最佳答案

您的代码中存在多个问题:

  • 您正在测试 tokenNULL 值,将其用作 strcpy 的参数后:您除非所有 3 个部分都存在,否则有效地调用未定义的行为。
  • 您传递数组 input 的地址作为 scanf("%[\n]" 的目标。这是不正确的,尽管不太可能导致问题。
  • "%[\n]" 格式的末尾有一个额外的s。不正确但不是主要问题。
  • 您没有检查 scanf() 的返回值。如果输入为空,您的代码将调用未定义的行为。
  • 您没有为 scanf 提供大小信息,以防止缓冲区因无效输入而溢出。
  • firstNamemiddleNamelastName 的数组小于intput。您可能会在名称部分很长的输入上导致缓冲区溢出。

这是更正后的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char space[2] = " ";

int main(void) {
char input[50], firstName[50], middleName[50], lastName[50], *token;

if (scanf("%49[^\n]", input) != 1)
return 1;
token = strtok(input, space);
if (token != NULL) {
strcpy(firstName, token);
token = strtok(NULL, space);
if (token != NULL) {
strcpy(middleName, token);
token = strtok(NULL, space);
if (token != NULL) {
strcpy(lastName, token);
printf("%s %c. %c.\n", lastName, middleName[0], firstName[0]);
} else {
printf("%s %c.\n", middleName, firstName[0]);
}
} else {
printf("%s\n", firstName);
}
}
return 0;
}

请注意,您不需要复制名称部分,strtok() 返回指向 input 数组的指针,这些指针在连续调用后保持有效,只要 input 仍在范围内。这是一个更简单的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char space[2] = " ";

int main(void) {
char input[50], *part1, *part2, *part3;

if (scanf("%49[^\n]", input) != 1)
return 1;

part1 = strtok(input, space);
if (part1 != NULL) {
part2 = strtok(NULL, space);
if (part2 != NULL) {
part3 = strtok(NULL, space);
if (part3 != NULL) {
printf("%s %c. %c.\n", part3, *part1, *part2);
} else {
printf("%s %c.\n", part2, *part1);
}
} else {
printf("%s\n", part1);
}
}
return 0;
}

关于c - 我在第二个 if 循环中不断出现段错误 11,这是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38489049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com