0

我在 C 中有点新,所以我不知道我是否允许在 C 中执行以下“if”,我的错误发生在 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;
}

如果有人可以帮助我,我将不胜感激......提前谢谢你!

4

2 回答 2

1

编辑:我已经重写了完整和正确的答案。

您期望将整数%d放入 char 中,这很可能具有不同的大小。int至少大小相同,而且通常更大,所以这可能是第一个应该炸毁的地方。

您可以在此处查看表格,以确定使用什么格式字符串说明符来匹配您正在阅读的变量的大小。对于 char 它应该是%hhd.

另请注意,您strcmp对单个字符使用字符串比较功能。不知道为什么编译器没有指出和之间的类型不char*匹配char。您可以强制它使用,&t1但最终可能会出现内存访问错误,因为strcmp预期输入是以空字符结尾的字符串,对于单个字符,它仅对空字符串“\0”有效。

还。如果你写一个格式字符串,像"P%s"符号P就不会出现在输出中。

你可以做什么。

坚持字符串是棘手的。您可以读取整个字符串,例如P3,并像您一样比较字符串,但是您需要记住它们是空终止的。所以要持有P3你需要类似的东西char t1[3]char t1;肯定不会举行"P3"

此外,除非您的输入格式正确并且您确定,否则从scanfplain读取字符串是危险的%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时,您都需要更新格式字符串,或动态构造它 - 更多代码。

就个人而言,我可能会尝试将类型数读入整数并构造ifvs 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;
}
于 2013-11-06T10:20:50.613 回答
-1

即使在

if((fscanf(f,"P%d", &t1)) == 1){

你应该使用

  int t1;

strcmp中,您正在传递 t1 而char不是const char *。在这里,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;
}
于 2013-11-06T08:53:18.840 回答