我想在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"
这是截图:
答案 0 :(得分:3)
printf
的参数需要是一个字符串,但是你将它传递给char
printf(choix);
它将该字符视为一个指针,但它不会是一个有效的指针,它指向一个你不应该尝试访问的内存非常低的位置。相反,您应该传递printf
一个带有格式指令的字符串,该格式指令需要一个char,例如在
printf("%c", choix);
或者您可以使用putchar
之类的功能并执行
putchar(choix);
然而,一旦你解决了问题,你就会遇到一些问题,结束你的循环。你结束时
(choix != 'c') || (choix != 'l') || (choix != 'e') || (choix != 's')
但每个字符不与c
,l
,e
或{{中的至少一个相同1}}。也就是说,假设用户键入s
。然后第一部分x
将成立,你将退出。如果用户键入了(choix != 'c')
,则会发生同样的事情,这应该是您的选项之一。如果你试图循环直到用户输入一个指定的字符,你需要循环
e
也就是说,只要它不是(choix != 'c') && (choix != 'l') && (choix != 'e') || (choix != 's')
,和就不再是c
_,和它不是{{1 },和它不是l
。您也可以将其称为“循环而不是(等于e
或s
l`或...)”,在这种情况下您可以循环
c
这个错误实际上在Stack Overflow上经常出现,但搜索起来相当困难。以下是Ruby中一个解决这个问题的问题:
答案 1 :(得分:2)