我在C中有点新,所以我不知道是否允许我做以下事情"如果"在C中,我的错误发生在if行但错误是一个分段错误,应该是一个未初始化的变量,但我从文件中给她一个值......好吧,有代码:
char t1, ch;
if((fscanf(f,"P%d", &t1)) == 1){
if(!((strcmp(t1,"P2")==0) || (strcmp(t1,"P5")==0))){ // error here
fprintf(stderr, "\nTipo de imagem invalido.\n");
fclose(f);
return NULL;
}
如果有人能帮助我,我会感激... 提前谢谢!
答案 0 :(得分:1)
编辑:我已经重写了答案是完整和正确的。
您希望将整数%d
放入char中,这些char很可能具有不同的大小。 int
至少相同,通常更大,所以这可能是第一个应该被炸毁的地方。
您可以查看table here以找出用于匹配您正在阅读的变量大小的格式字符串说明符。对于char,它应该是%hhd
。
另请注意,您对单个字符使用字符串比较函数strcmp
。不确定为什么编译器没有指出char*
和char
之间的类型未匹配。
您可以强制它与&t1
一起使用,但最终可能会出现内存访问错误,因为strcmp
期望输入为以空字符结尾的字符串,单个字符仅对空字符串有效' \ 0'
另外。如果您编写类似"P%s"
的格式字符串,P
符号将不会出现在输出中。
你能做什么。
坚持使用字符串很棘手。
你可以读取整个字符串,比如P3
,并像你一样比较字符串,但是你需要记住它们是空终止的。因此,要保留P3
,您需要char t1[3]
之类的内容。 char t1;
肯定不会成立"P3"
。
此外,除非您的输入格式正确并且您确定,否则使用普通scanf
从%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。
#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;
}
答案 1 :(得分:-1)
即使在
中也应该出现分段错误if((fscanf(f,"P%d", &t1)) == 1){
你应该使用
int t1;
在strcmp
中,您传递的是char
而不是const char *
的t1。这里,char值被强制转换为指针,现在它尝试访问t1位置的值。这导致分段错误。所以改变是
int t1;
if((fscanf(f,"P%d", t1))){
if(!((2 == t1) || (5 == t1))){ // error here
fprintf(stderr, "\nTipo de imagem invalido.\n");
fclose(f);
return NULL;
}