#include <stdio.h>
#include <string.h>
int main(){
char *command="0";
do {
printf("[A]dd, [P]rint, [Q]uit\n");
scanf("%s", command);
while (strcmp(command, "a") != 0 && strcmp(command, "A") != 0 && strcmp(command, "p") != 0 && strcmp(command, "P") != 0){
printf("Invalid input. Please enter one of the commands listed above.\n");
scanf("%s", command);
}
if (strcmp(command, "a") == 0 || strcmp(command, "A") == 0){
printf("You selected add.\n");
}
else if (strcmp(command, "p") == 0 || strcmp(command, "P") == 0){
printf("You selected print.\n");
}
}while (strcmp(command, "q") != 0 && strcmp(command, "Q")!= 0);
return 0;
}
我希望程序从开头打印的一个指定命令中接收用户的来信。如果他们输入q或Q,我希望程序退出。我花了一些时间来弄清楚如何与循环和ifs的字符串进行比较。现在,当我运行该程序时,它崩溃了。寻找有关其崩溃原因的见解。
答案 0 :(得分:1)
是的,将缓冲区command
放入常规数组中,然后将其放大:
char command[256];
无需初始化,scanf
将负责处理。此外,它不会影响崩溃,但如果你只检查一个字母,你可以这样做:
if command[0] != 'a' && command[0] != 'A' (etc.)
注意单引号:这是一个字符比较。
答案 1 :(得分:0)
char *command="0";
scanf("%s", command);
您正在写一个字符串文字(只有2个字节),并且字符串文字不需要是可修改的。
使用类似的东西:
char command[256];
scanf("%s", command);
或者更好地使用fgets
+ sscanf
来避免潜在的缓冲区溢出。
答案 2 :(得分:0)
这是指向只读内存的指针:
char *command="0";
这意味着这是错误的:
scanf("%s", command);
“快速入侵”,这是做坏事的方法,是改变命令的定义,因此它获得了一些读写内存而不是只读内存:
char command[256] = "0";
但这仍然会让你陷入缓冲区溢出的严重危险。请勿使用scanf
。
“更好的方法”是使用fgets
代替scanf
:
char command[256];
char *p;
p = fgets(command, sizeof(command), stdin);
if (!p) { handle error or EOF }
/* Don't forget that 'command' will probably have '\n' at the end,
you will have to strip it off */
答案 3 :(得分:0)
嗯,首先突然出现的是你正在使用scanf
将数据读入只读内存 - 即字符串常量。尝试此操作时会发生什么是未定义的,但程序可能会崩溃。您需要为command
分配一些读/写内存;例如,将其声明为
char command[10];