通过在带有或不带有&符号的scanf中摆脱分段错误

问题描述

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

  • 问题1:使用带有&标记的scanf

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

  • 问题2:结合使用scanf和&符号

如果我将scanf("%s",&to_find);&一起使用,并像这样to_find[50] to_find 变量设置为等于 50 ,则{{1}像这样显示消息 scanf 而且if陈述也无法运作,给我这样的讯息warning: format specifies type 'char *' but the argument has type 'char (*)[50]'

  • 问题3:使用fgets

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

exited,segmentation fault

解决方法

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()将使变量溢出。

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