编辑:我已经重写了完整和正确的答案。
您期望将整数%d
放入 char 中,这很可能具有不同的大小。int
至少大小相同,而且通常更大,所以这可能是第一个应该炸毁的地方。
您可以在此处查看表格,以确定使用什么格式字符串说明符来匹配您正在阅读的变量的大小。对于 char 它应该是%hhd
.
另请注意,您strcmp
对单个字符使用字符串比较功能。不知道为什么编译器没有指出和之间的类型不char*
匹配char
。您可以强制它使用,&t1
但最终可能会出现内存访问错误,因为strcmp
预期输入是以空字符结尾的字符串,对于单个字符,它仅对空字符串“\0”有效。
还。如果你写一个格式字符串,像"P%s"
符号P
就不会出现在输出中。
你可以做什么。
坚持字符串是棘手的。您可以读取整个字符串,例如P3
,并像您一样比较字符串,但是您需要记住它们是空终止的。所以要持有P3
你需要类似的东西char t1[3]
。char t1;
肯定不会举行"P3"
。
此外,除非您的输入格式正确并且您确定,否则从scanf
plain读取字符串是危险的%s
。你永远不知道输入会有多长时间,它最终可能会溢出你的缓冲区......你应该指定要读取的字符串的长度,例如%2s
。
#include <stdio.h>
#include <stdlib.h>
#define TYPE_SIZE 2
char ch;
int size;
char t1[TYPE_SIZE+1];
int main(){
if( (scanf("%2s", &t1) == 1)){
printf("t1=%s", t1);
if(!((strcmp(t1,"P2")==0) || (strcmp(t1,"P5")==0))){ // error here
fprintf(stderr, "\nTipo de imagem invalido.\n");
return -1;
}
} else fprintf(stderr, "Wrong input.\n");
return 0;
}
如果您输入P5456456
,仍然这样,不会有错误。您需要在第一个两个字符之后使用输入并对其进行测试。您还需要跟踪最大类型长度。您也可以TYPE_SIZE
提前更改为超大的东西,但这是需要寻找的东西,而且容易出错(更理论上,但仍然如此)。每当您更改TYPE_SIZE
时,您都需要更新格式字符串,或动态构造它 - 更多代码。
就个人而言,我可能会尝试将类型数读入整数并构造if
vs it。
#include <stdio.h>
#include <stdlib.h>
char ch;
int size;
unsigned char t1;
int main(){
if( (scanf("P%hhu", &t1) == 1)){
printf("t1=%u\n", t1);
if(!((t1 == 2) || (t1 == 5))){ // error here
fprintf(stderr, "\nTipo de imagem invalido.\n");
return -1;
}
} else fprintf(stderr, "Wrong input.\n");
return 0;
}