我尝试比较从scanf和fscanf获得的两个字符串。我已经弄明白每个变量里面的内容是什么。它都显示相同的字符串,但在if语句中与这两个字符串进行比较后,它不会工作并执行else语句。我的代码有什么问题?
int main(void)
{
...
char input[256];
printf("Enter your name: ");
scanf("%s",&input);
fp = fopen(_FILE,"r+");
for(i=0;i<textlines(_FILE);i++)
{
fscanf(fp,"%s %d",stuff[i].name,&stuff[i].salary);
if(input == stuff[i].name)
{
// Update name here
}
else
{
printf("Not Found");
}
}
return 0;
}
答案 0 :(得分:8)
==
只是检查指针是否相等。请改用strcmp
答案 1 :(得分:2)
使用string.h库中的strcmp函数来比较字符串
答案 2 :(得分:2)
正如其他人所说,你需要使用strcmp来比较字符串(真正的字符数组)。此外,您不应将名称的地址(即&amp; name)传递给scanf()函数。
你有这个:
char input[256];
printf("Enter your name: ");
scanf("%s",&input);
....
if(input == stuff[i].name)
...
更正确的代码将包含以下更改:
char input[256];
printf("Enter your name: ");
scanf("%s", input);
....
if (!strcmp(input, stuff[i].name))
....
你应该检查stuff [i] .name的定义和用法。具有%s格式字符的scanf()需要一个简单的char *参数。 C比其他语言更灵活,因为它允许您获取变量的地址。您可以通过这种方式创建指向变量的指针。但是,声明为数组的变量(如输入)在某种程度上已经是指针。只有通过提供索引才能取消引用指针。具体做法是: &amp;输入不好C表格。您可以将此视为数组的地址,但实际上,输入已经是数组的地址。这种类型的双重处理变量有一个用途,但你的情况实际上不是其中之一。在您对数组和指针(及其关系)进行一些练习之前,以下示例可能有点令人困惑,但它确实展示了可能使用char **变量的位置。char input[256];
input is a pointer to the storage of 256 char's
input can be thought of as a char* variable
input[0] is the first char in the array
input[1] is the second char in the array
input+1 is a pointer to the second char in the array.
input+0 (or simply input) is a pointer to the first char in the array.
int allow_access_to_private_data(char ** data)
{
static char mystring[] = "This is a private string";
if (!data) return -1;
*data = mystring;
return 0;
}
int main(int argc, char* argv[])
{
char* string;
if (!allow_access_to_private_data(&string))
printf("Private data is: %s\n", string);
else
printf("Something went wrong!\n");
return 0;
}