2014-10-03 102 views
-1

在这个简单的一维数组程序中,& 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; 
} 

但是在二维数组中,它显示错误。为什么? 例如: 这里,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

你是如何定义和分配你的主表? – 2014-10-03 08:37:09

+0

您只扫描一个'char'。那你为什么写'%s'。 – 2014-10-03 08:39:01

+0

您试图在字符中存储字符串 – 2014-10-03 08:40:31

回答

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]); 

- >第一个字符masterlist[i][0]ith行你2D阵列中的哪一个不是地址可以存储值字符串。

- >&masterlist[i][0]ith行你2D数组这是地址,您可以存储char即串的序列。

但是在1D的情况下,即yourname包含基地址yourname数组,因此你可以在那里存储一个字符序列。

+0

你可以给我的理由 – Walter 2014-10-03 09:01:42

+0

感谢Rustam你的解释 – Walter 2014-10-03 09:09:18

+0

@AbhishekWalterü欢迎。如果它很明确,那么希望你会接受我的回答 – Rustam 2014-10-03 09:11:39

4

在你的第一个例子中,你使用p&p这是指针都指向p[0]这一点。

在你的最后一个例子,masterlist[i][0]相当于p[0],这是一个char,因此发送到printf参数提升为int。扫描码"%s"需要一个指向可写内存的指针。 masterlist[i][0]指向可写内存的可能性极小。

并非所有的编译器都会将扫描码检查为printf。有些人会这样做,并且在适当的警告级别下,您会收到警告。尝试将-Wall添加到编译器命令行中,它变成了gcc和其他一些编译器的警告级别。

+0

+1的“扫描代码”的答案。%s“需要一个指向可写内存的指针”。 – 2014-10-03 08:55:16