通过使用带或不带 & 符号的 scanf 来消除分段错误
Get rid of segmentation fault by using scanf with or without & sign
在这段代码中,我面临 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]
然后 scanf
像那样显示消息
warning: format specifies type 'char *' but the argument has type 'char (*)[50]'
并且 if 语句也不起作用给我这样的消息 exited, segmentation fault
- 问题 #3:使用 fgets
如果我使用 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()
会溢出变量。
您应该使用调试器来确定错误发生的准确位置。
在这段代码中,我面临 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]
然后 scanf
像那样显示消息
warning: format specifies type 'char *' but the argument has type 'char (*)[50]'
并且 if 语句也不起作用给我这样的消息 exited, segmentation fault
- 问题 #3:使用 fgets
如果我使用 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()
会溢出变量。
您应该使用调试器来确定错误发生的准确位置。