用strncmp在linux上进行C分段故障

时间:2015-12-22 19:08:27

标签: c linux string segmentation-fault c-strings

这有用('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 *)。没有铸造,同样的错误。

FYI user_input()是(N.B. vars是全局的):

char* user_input(int size) { //size is the number of characters to capture. Remember to account for \n or \0
    if (fgets(buf, size, stdin) != NULL) { //buf is char buf[1000];
        if ((p = strchr(buf, '\n')) != NULL) //Check if carriage return in string
            *p = '\0'; //Replace carriage return with NULL
        p = buf; //Set pointer back to input for others to access
        return *p;
   } else {
       p = buf;
       p[0] = "\0";
       return "\0"; //Return NULL if input fails
   }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

toupper的返回值是另一个字符,而不是指向字符串的指针。因此,您正在尝试访问内存地址131,这就是您遇到段错误的原因。由于您只对这一个字符感兴趣,因此可以用以下内容替换违规行:

if (toupper(user_input(2)) == 'Y') {
   printf("You said yes\n");
}

请注意,在比较中Y是单引号,表示您正在处理字符值(而不是双引号,表示字符串值)。