通过使用带或不带 & 符号的 scanf 来消除分段错误

Get rid of segmentation fault by using scanf with or without & sign

在这段代码中,我面临 3 个问题。如何摆脱它们?

如果我使用 scanf("%s", to_find); 而不使用 & 并将 to_find 变量设置为 50像这样 to_find[50] 然后 if 语句不起作用并给我这样的消息 exited, segmentation fault

如果我将 scanf("%s", &to_find);& 一起使用并将 to_find 变量设置为 50像这样 to_find[50] 然后 scanf 像那样显示消息 warning: format specifies type 'char *' but the argument has type 'char (*)[50]' 并且 if 语句也不起作用给我这样的消息 exited, segmentation fault

如果我使用 fgets(to_find, 50, stdin); 并设置 to_find 变量等于 50 像这样 to_find[50] 然后 if 语句不起作用给我这样的消息 exited, segmentation fault

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
  FILE * fr = fopen("file.csv", "r");
  char save[500], line[200],  to_find[50];
  int oneByOne = 0;

  printf("Enter the ID card number: ");
  scanf("%s", to_find);
  // fgets(to_find, 50, stdin);

  if(isdigit(to_find) && strlen(to_find) ==  13){
    while(fgets(line, 200, fr)){
      char *word = strtok(line, "\n");
      strcpy(save, line);

      if (strstr(save, to_find)){
        char *wordone = strtok(save, ",");
        while (wordone != NULL){
          printf("Here are your details:  %s\n", wordone);
          wordone = strtok(NULL, ",");
        }
      }
    }
    fclose(fr);
  }
  else {    printf("enter correclty");    }
return 0;
}

scanf("%s", to_find) 是读取字符串的正确方法。当用作函数参数时,数组会自动转换为指向第一个元素的指针,因此您不需要使用 &.

您的 if 语句不起作用,因为 isdigit() 的参数必须是单个 char,它不会对字符串的所有字符进行操作。如果你想测试一个字符串是否完全是数字,你可以写一个这样的函数:

int all_digits(char *s) {
    for (; *s != 0; s++) {
        if (!isdigit(*s)) {
            return 0;
        }
    }
    return 1;
}

那么你可以使用这个功能:

if (strlen(to_find) == 13 && all_digits(to_find)) {
    ...
}

我怀疑您是否真的在 if (isdigit(to_find) && strlen(to_find) == 13) 语句中遇到了分段错误。取消引用无效指针时会发生分段错误,但 isdigit() 不会取消引用任何指针。如果输入的单词超过 49 个字符,strlen(to_find) 可能会出错,因为 scanf() 会溢出变量。

您应该使用调试器来确定错误发生的准确位置。