二维数组问题

时间:2014-10-03 08:32:58

标签: c arrays multidimensional-array

在这个简单的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;

    }

2 个答案:

答案 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数组的基地址,因此您可以在那里存储一系列字符。