简单的输入。程序崩溃 #包括 #包括 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; }
我想让程序从开始打印的指定命令之一接收用户的一封信。如果他们输入q或q,我希望程序退出。我花了一段时间才明白如何与循环和ifs的字符串进行比较。现在,当我运行程序时,它崩溃了。寻找其崩溃原因的见解简单的输入。程序崩溃 #包括 #包括 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");
#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
。正确使用它们太棘手了。