简单的输入。程序崩溃

时间:2012-03-04 22:32:00

标签: c

#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的字符串进行比较。现在,当我运行该程序时,它崩溃了。寻找有关其崩溃原因的见解。

4 个答案:

答案 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];