Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的输入。程序崩溃 #包括 #包括 int main(){ char*command=“0”; 做{ printf(“[A]dd[P]rint[Q]uit\n”); scanf(“%s”,命令); while(strcmp(command,“a”)!=0和strcmp(command,“a”)!=0和strcmp(command,“p”)!=0和strcmp(command,“p”)!=0){ printf(“无效输入。请输入上面列出的命令之一。\n”); scanf(“%s”,命令); } 如果(strcmp(命令,“a”)==0 | | strcmp(命令,“a”)==0){ printf(“您选择了添加。\n”); } else if(strcmp(命令,“p”)==0 | | strcmp(命令,“p”)==0){ printf(“您选择了打印。\n”); } }while(strcmp(command,“q”)!=0和strcmp(command,“q”)!=0); 返回0; }_C - Fatal编程技术网

简单的输入。程序崩溃 #包括 #包括 int main(){ char*command=“0”; 做{ printf(“[A]dd[P]rint[Q]uit\n”); scanf(“%s”,命令); while(strcmp(command,“a”)!=0和strcmp(command,“a”)!=0和strcmp(command,“p”)!=0和strcmp(command,“p”)!=0){ printf(“无效输入。请输入上面列出的命令之一。\n”); scanf(“%s”,命令); } 如果(strcmp(命令,“a”)==0 | | strcmp(命令,“a”)==0){ printf(“您选择了添加。\n”); } else if(strcmp(命令,“p”)==0 | | strcmp(命令,“p”)==0){ printf(“您选择了打印。\n”); } }while(strcmp(command,“q”)!=0和strcmp(command,“q”)!=0); 返回0; }

简单的输入。程序崩溃 #包括 #包括 int main(){ char*command=“0”; 做{ printf(“[A]dd[P]rint[Q]uit\n”); scanf(“%s”,命令); while(strcmp(command,“a”)!=0和strcmp(command,“a”)!=0和strcmp(command,“p”)!=0和strcmp(command,“p”)!=0){ printf(“无效输入。请输入上面列出的命令之一。\n”); scanf(“%s”,命令); } 如果(strcmp(命令,“a”)==0 | | strcmp(命令,“a”)==0){ printf(“您选择了添加。\n”); } else if(strcmp(命令,“p”)==0 | | strcmp(命令,“p”)==0){ printf(“您选择了打印。\n”); } }while(strcmp(command,“q”)!=0和strcmp(command,“q”)!=0); 返回0; },c,C,我想让程序从开始打印的指定命令之一接收用户的一封信。如果他们输入q或q,我希望程序退出。我花了一段时间才明白如何与循环和ifs的字符串进行比较。现在,当我运行程序时,它崩溃了。寻找其崩溃原因的见解 #include <stdio.h> #include <string.h> int main(){ char *command="0"; do { printf("[A]dd, [P]rint, [Q]uit\n");

我想让程序从开始打印的指定命令之一接收用户的一封信。如果他们输入q或q,我希望程序退出。我花了一段时间才明白如何与循环和ifs的字符串进行比较。现在,当我运行程序时,它崩溃了。寻找其崩溃原因的见解

#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;
}
您正在写入一个字符串文字(只有2个字节),不需要修改字符串文字

改用类似的方式:

char *command="0";
scanf("%s", command);

或者最好使用
fgets
+
sscanf
来避免潜在的缓冲区溢出。

这是指向只读内存的指针:

char command[256];
scanf("%s", command);
scanf("%s", command);
这意味着这是错误的:

char *command="0";
“快速破解”是做这件事的坏方法,它改变了命令的定义,使它获得一些读写内存而不是只读内存:

char command[256];
scanf("%s", command);
scanf("%s", command);
但这仍然会使您面临缓冲区溢出的严重危险。不要使用
scanf

“更好的方法”是使用
fgets
而不是
scanf

char command[256] = "0";

首先,我突然想到的是,你正在使用
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 */

是的,将缓冲区
命令
设置为一个常规数组,并使其更大:

char command[10];
无需对其进行初始化,
scanf
将处理该问题。此外,它不会影响崩溃,但如果您只检查一个字母,您可以这样做:

char command[256];

注意单引号:这是一个字符比较

可能有助于包含您收到的错误消息。它在哪里崩溃?附加调试器时,程序崩溃时的状态是什么?实际状态是否与预期状态匹配?无法更改
命令的内容:它指向字符串文字。请改为尝试数组:
char命令[]=“0”。并确保限制使用scanf读取的字符串的长度:
scanf(“%1s”)
scanf
正在尝试将N个字节写入
命令所指向的地址,该地址是字符串文字(只读)。您需要分配足够的内存来存储这N个字节,或者声明一个固定长度的
字符数组。示例:
char命令[255];scanf(“%254s”,命令)fgets和sccanf在这种情况下更好?传递到
scanf
的格式字符串允许限制字符串大小。例如:“%255s”@jweyrich:这很好,但是还有99个不使用
scanf
@TristanPearce的原因:避免
sscanf
scanf
fscanf
vfscanf
vscanf
,以及
vsscanf
。正确使用它们太棘手了。