1

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

#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"

这是一个截图:

应用程序截图

4

2 回答 2

3

分段错误

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

printf(choix);

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

printf("%c", choix);

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

putchar(choix);

循环条件问题

然而,一旦你解决了这个问题,你就会在结束循环时遇到一些问题。你什么时候结束

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

每个字符都cle或中的至少一个不同s。也就是说,假设用户键入x. 然后第一部分(choix != 'c')将是真实的,您将退出。如果用户键入了 ,也会发生同样的事情e,这应该是您的选择之一。如果您尝试循环直到用户输入指定字符之一,则需要循环 while

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

也就是说,只要它不是,你就继续循环c不是l_,不是e不是s。您也可以将其表述为“循环而不是(等于cequal tol` 或 ...)”,在这种情况下,您可以循环

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

这个错误其实在 Stack Overflow 上出现的频率比较高,但是比较难找。这是解决此问题的 Ruby 中已回答的问题:

于 2013-10-15T22:25:21.407 回答
2

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

在屏幕截图的底部,您可以看到来自编译器的警告告诉您这一点。永远不要忽略编译器警告!

putchar使用或使用格式字符串打印您的字符%cprintf

printf("%c\n", choix);
于 2013-10-15T22:26:36.660 回答