在这个简单的1D阵列程序中,& p和p都在scanf语句中使用%s。它没有显示任何错误。
#include<stdio.h>
int main()
{
char p[5];
scanf("%s",&p);
printf("%s",p);
scanf("%s",p);
printf("%s",p);
return 0;
}
但是在2D字符数组中,它显示错误。为什么?
例如:
在这里,masterlist
是一个二维的字符数组。
为什么这段代码有效?
for(i=0;i<5;i++)
scanf("%s",&masterlist[i][0]);
为什么这段代码不起作用?为什么编译器没有显示任何错误?
for(i=0;i<5;i++)
scanf("%s",masterlist[i][0]);
实际代码:我的程序正在运行,我只想知道上面提到的内容。感谢。
#include<string.h>
#include<stdio.h>
#define FOUND 1
#define NOTFOUND 0
int main()
{
char masterlist[6][10]={"akshay","parag","raman","srinivas","gopal","rajesh"};
int i,flag,a;
char yourname[10];
printf("Enter your Name:");
scanf("%s",yourname);
flag=NOTFOUND;
for(i=0;i<=5;i++)
{
a=strcmp(&masterlist[i][0],yourname);
if(a==0)
{
printf("Welcome,you can Enter The place\n");
flag=FOUND;
break;
}
}
if(flag==NOTFOUND)
printf("Sorry,Yoy are a trespasser\n");
return 0;
}
答案 0 :(得分:4)
在您的第一个示例中,您使用的p
和&p
指针都指向p[0]
。
在上一个示例中,masterlist[i][0]
相当于p[0]
,即char
,因此发送到printf
的参数会提升为int
。扫描代码"%s"
需要指向可写内存的指针。 <{1}}极不可能指向可写内存。
并非所有编译器都会将扫描码检查到masterlist[i][0]
。有些人会这样做,并且在适当的警告级别,您将收到警告。尝试将printf
添加到编译器命令行,它会显示-Wall
和其他一些编译器的警告级别。
答案 1 :(得分:2)
打印此内容,然后查看输出结果,希望您了解&
的情况下为何需要2D
:
printf("&yourname = %p\n",&yourname);
printf("yourname = %p\n",yourname);
printf("&masterlist[i][0] = %p\n",&masterlist[0][0]);
printf("masterlist[i][0] = %p\n",masterlist[0][0]);
- &GT; masterlist[i][0]
指向ith
数组的2D
行的第一个字符,该字符不是您可以存储值字符串的地址。
- &GT; &masterlist[i][0]
指向ith
数组的2D
行,该行是您可以存储char
序列的地址,即字符串。
但是在1D
数组的情况下,yourname
包含yourname
数组的基地址,因此您可以在那里存储一系列字符。