./geany_run_script.sh:分段错误

时间:2013-10-15 22:22:14

标签: c segmentation-fault printf getchar geany

我想在C中创建一个显示菜单的简单程序,用户必须通过选择char来从选择中进行选择。这是我试过的代码:

#include <stdio.h>

void menu();

int main(int argc, char **argv)
{

    menu();
    return 0;
}

void menu(){
    char choix;
    printf("(C)réer un fichier\n");
    printf("(L)ire un fichier\n");
    printf("(E)crire sur un fichier\n");
    printf("(S)upprimer un fichier\n");
    do{
        choix = tolower(getchar());
        printf(choix);
    }while((choix != 'c') || (choix != 'l') || (choix != 'e') || (choix != 's'));
    printf("end");
}

但是当我运行我的应用程序时,我在控制台中收到此消息:

./geany_run_script.sh: line 5:  6582 Segmentation fault (core dumped) "./main"

这是截图:

screenshot of application

2 个答案:

答案 0 :(得分:3)

分段错误

printf的参数需要是一个字符串,但是你将它传递给char

printf(choix);

它将该字符视为一个指针,但它不会是一个有效的指针,它指向一个你不应该尝试访问的内存非常低的位置。相反,您应该传递printf一个带有格式指令的字符串,该格式指令需要一个char,例如在

printf("%c", choix);

或者您可以使用putchar之类的功能并执行

putchar(choix);

循环条件问题

然而,一旦你解决了问题,你就会遇到一些问题,结束你的循环。你结束时

(choix != 'c') || (choix != 'l') || (choix != 'e') || (choix != 's')

每个字符cle或{{中的至少一个相同1}}。也就是说,假设用户键入s。然后第一部分x将成立,你将退出。如果用户键入了(choix != 'c'),则会发生同样的事情,这应该是您的选项之一。如果你试图循环直到用户输入一个指定的字符,你需要循环

e

也就是说,只要它不是(choix != 'c') && (choix != 'l') && (choix != 'e') || (choix != 's') 就不再是c _,它不是{{1 },它不是l。您也可以将其称为“循环而不是(等于es l`或...)”,在这种情况下您可以循环

c

这个错误实际上在Stack Overflow上经常出现,但搜索起来相当困难。以下是Ruby中一个解决这个问题的问题:

答案 1 :(得分:2)

printf期望一个字符串(char *)作为它的第一个参数,你给它一个char它试图解释为一个指针。这指向一些可能无法读取的地址导致分段错误。

在屏幕截图的底部,您可以看到编译器发出的警告。永远不要忽略编译器警告!

使用putchar打印您的角色,或使用%c格式字符串中的printf

printf("%c\n", choix);