“中的错误”;如果不正确,则为C

“中的错误”;如果不正确,则为C,c,if-statement,fault,C,If Statement,Fault,我是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.\

我是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;
}
如果有人能帮助我,我将非常感激。。。
提前谢谢你

即使在

if((fscanf(f,"P%d", &t1)) == 1){
你应该使用

  int t1;
在strcmp
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;
}

编辑:我已将答案改写为完整和正确

您希望将一个整数
%d
放入一组字符中,这些字符很可能大小不同
int
至少大小相同,而且通常更大,所以这可能是第一个应该被放大的地方

您可以查看以确定要使用何种格式字符串说明符来匹配正在读取的变量的大小。对于字符,它应该是
%hhd

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

还有。如果编写类似于
“P%s”
的格式字符串,
P
符号将不会出现在输出中

你能做什么

坚持到底是件棘手的事。 您可以读取整个字符串,如
P3
,并像您一样比较字符串,但是您需要记住它们以null结尾。因此,要保持
P3
,您需要类似于
chart1[3]
的内容<代码>字符t1肯定不会保留
“P3”

此外,除非您的输入格式正确并且您确信,否则使用纯
%s
scanf
读取字符串是危险的。您永远不知道输入将持续多长时间,它可能会溢出您的缓冲区。。。 您应该指定要读取的字符串的长度,例如
%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;
}

此代码不应编译
strcmp
期望
char*
作为第一个参数。正如您所知,这并不能保证正确的对齐,许多实现在这样的写操作中都会出现总线故障<代码>%d需要一个与
int
兼容的目标。填充到
字符[n]
中不是解决方案。如果这是
%s
您可能了解了一些情况。谢谢,我用字符t1[3]和%2s解决了这个问题。。。多谢各位!不过,请注意这些注意事项!你可能会遇到讨厌的虫子来追踪。对于真正的生产代码,我会将
TYPE_SIZE
增加到5左右。使用
char t1[3]
%2s
,一旦数字超过9,您就会遇到麻烦。
#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;
}