使用 strncmp 在 linux 上出现 C 分段错误
C segmentation fault on linux with strncmp
有效('Y' 必须是单引号):
if (toupper(user_input(2)) == 'Y') printf("you said y");
这给出了分段错误:
if (!strncmp((char *)toupper(user_input(2)), "Y", 1)) printf("you said y");
strncmp 一定是走得太远了,但不确定为什么,因为我将一个铸造的 toupper() 作为 (char *) 传递。没有铸造,同样的错误。
仅供参考 user_input() 是(N.B。变量是全局的):
char* user_input(int size) { //size is the number of characters to capture. Remember to account for \n or [=13=]
if (fgets(buf, size, stdin) != NULL) { //buf is char buf[1000];
if ((p = strchr(buf, '\n')) != NULL) //Check if carriage return in string
*p = '[=13=]'; //Replace carriage return with NULL
p = buf; //Set pointer back to input for others to access
return *p;
} else {
p = buf;
p[0] = "[=13=]";
return "[=13=]"; //Return NULL if input fails
}
}
谢谢。
toupper
的return值是另一个字符,不是指向字符串的指针。所以您正在尝试访问内存地址 131,这就是您遇到段错误的原因。由于您只对一个字符感兴趣,因此您可以将违规行替换为:
if (toupper(user_input(2)) == 'Y') {
printf("You said yes\n");
}
请注意,在比较中 Y
是单引号,表示您正在处理字符值(与表示字符串值的双引号相反)。
有效('Y' 必须是单引号):
if (toupper(user_input(2)) == 'Y') printf("you said y");
这给出了分段错误:
if (!strncmp((char *)toupper(user_input(2)), "Y", 1)) printf("you said y");
strncmp 一定是走得太远了,但不确定为什么,因为我将一个铸造的 toupper() 作为 (char *) 传递。没有铸造,同样的错误。
仅供参考 user_input() 是(N.B。变量是全局的):
char* user_input(int size) { //size is the number of characters to capture. Remember to account for \n or [=13=]
if (fgets(buf, size, stdin) != NULL) { //buf is char buf[1000];
if ((p = strchr(buf, '\n')) != NULL) //Check if carriage return in string
*p = '[=13=]'; //Replace carriage return with NULL
p = buf; //Set pointer back to input for others to access
return *p;
} else {
p = buf;
p[0] = "[=13=]";
return "[=13=]"; //Return NULL if input fails
}
}
谢谢。
toupper
的return值是另一个字符,不是指向字符串的指针。所以您正在尝试访问内存地址 131,这就是您遇到段错误的原因。由于您只对一个字符感兴趣,因此您可以将违规行替换为:
if (toupper(user_input(2)) == 'Y') {
printf("You said yes\n");
}
请注意,在比较中 Y
是单引号,表示您正在处理字符值(与表示字符串值的双引号相反)。