我的老师告诉我们使用“&”来将值存储到我们想要的变量中,但是,我尝试使用 scanf() 并尝试将值存储到一些没有“&”的变量中,我注意到它仍然工作正常吗?尽管我认为它没有影响,但它是否无论如何都会影响我的代码?
这是我试过的代码。该代码是用于检查第二个输入是否为子字符串的部分。我老师教的原形:
int main(){
char word1[100], word2[100];
int length1, length2;
printf("Enter the a word: \n");
scanf("%s", &word1);
printf("Enter the potetial substring: \n");
scanf("%s", &word2);
for(length1=0; word1[length1]!='\0'; length1++);
for(length2=0; word2[length2]!='\0'; length2++);
if (length1<length2)
{
printf("Second input is not a substring.\n");
}
然后我调整了程序要求输入的部分:
printf("Enter the a word: \n");
scanf("%s", word1);
printf("Enter the potetial substring: \n");
scanf("%s", word2);
即使我删除了“&”,我仍然得到相同的输出。希望有人可以解释此更改是否以我可能不知道的某种方式影响了我的代码,谢谢。
C 数组在评估上下文(例如传递给 scanf
的参数)下表示为指向类型的指针,其中类型是数组的基础元素类型。因此word
表示为char*
。地址结果是第一个元素的结果。
然而,&word1
评估为相同 地址,但键入为 char (*)[100]
(因为这正是您所要求的为了)。这是相同的地址,因此针对 %s
说明符的 scanf
仍然“有效”(松散使用的术语)。
您的编译器应该会发出警告,告诉您预期的参数类型是 char*
而您正在提供 char(*)[100]
。如果没有,请调高警告。
总结; %s
的正确语法是传递一个 char*
。在这种情况下,这是通过 word1
获得的(冲洗/重复 word2
)。它可以使用寻址运算符工作,但没有理由在这种情况下使用它,并且有充分的理由不这样做。
我是一名优秀的程序员,十分优秀!