“if not true”中的错误 - C.

时间:2013-11-06 08:47:59

标签: c if-statement fault

我在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;
}

如果有人能帮助我,我会感激... 提前谢谢!

2 个答案:

答案 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;
}