问题描述
- 问题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()
将使变量溢出。
您应该使用调试器来确定错误发生的确切位置。