void viewonechar(){
char name[25], c[25];
int n;
fp = fopen("Phonebook.txt","r");
printf ("\n\n Enter Character : ");
scanf ("%s",c);
fscanf (fp, "%s %d", name, &n);
while (!feof(fp)){
if ((strcmp(c, name[0])) == 0){ \\ Warning in here
printf (" %s +880%d\n",name, n);
}
fscanf (fp, "%s %d", name, &n);
}
printf ("\n\n");
fclose(fp);
menu();
}
当我编译代码时,在标记的行上出现此警告,“传递strcmp的参数2使得指针来自整数而没有强制转换”。我究竟做错了什么?
答案 0 :(得分:1)
int strcmp(const char * str1,const char * str2);
由于name
是char
的数组,name[0]
是char
。 strcmp
将char
指针作为参数,因此您提供的char
被隐式转换为int类型然后 - 指向指针,这会产生未定义的行为,并且很可能会导致段错误。
答案 1 :(得分:1)
有很多问题。
避免使用scanf()。见:Why does everyone say not to use scanf? What should I use instead?。请改用fgets()。由于您只阅读一个字符,char c[2]
就足够了(并且也不会在\n
字符中读取)。
始终对所有标准功能进行错误检查。
您的循环条件错误。请参阅:Why is “while ( !feof (file) )” always wrong? 如果修复循环,则无需在外部循环扫描。
由于您只需要比较第一个字符,您只需使用c[0] == name[0]
。
以下代码修复了上述问题:
void viewonechar(void)
{
char name[25], c[25];
int n;
FILE fp = fopen("Phonebook.txt","r");
if (!fp) {
perror("fopen");
exit(1);
}
printf ("\n\n Enter Character : ");
if (fgets(c, sizeof c, stdin) == NULL) {
fprintf(stderr, "Input error\n");
exit(1);
}
while (fscanf (fp, "%24s %d", name, &n) == 2) {
if (c[0] == name[0]) {
printf (" %s +880%d\n",name, n);
}
}
printf ("\n\n");
fclose(fp);
menu();
}