这段代码是制作简单字典的先行者。即时尝试将单词和含义插入数组中。看来问题是什么?
#include <stdio.h>
#include<string.h>
main(){
char alp, *a[5][1], item[100],item2[150];
for (int i =1;i <=5 ; i++){
printf("\n\nEnter item [%d][%d]:",i,0);
scanf("%s",&item);
printf("Enter item meaning [%d][%d]:",i,0);
scanf("%s",&item2);
strcpy(a[i][0],item); //program stops here
strcpy(a[i][1],item2);
printf("word %s \nmeaning: %s",a[i][0],a[i][1]);
}
}
答案 0 :(得分:1)
你的循环应该如下:
for (int i =1;i <5 ; i++){
请注意&lt; 而不是&lt; = 。如果声明大小为5的数组,则最后一个元素位于索引4。
此外,初始化为a[5][2][100]
而不是*a[5][1]
答案 1 :(得分:1)
你在这里
#include <stdio.h>
#include <string.h>
#define N 5
int main( void )
^^^^^^^^^^^^^^^^
{
char a[N][2][150], item[150], item2[150];
^^^^^^^^^^^^
for ( int i = 0; i < N ; i++ )
^^^^^^^^^^^^^^^^^^^^^^
{
printf( "\n\nEnter item [%d][%d]: ", i, 0 );
scanf( "%s", item );
^^^^
printf( "Enter item meaning [%d][%d]: ", i, 1 );
scanf( "%s", item2 );
^^^^^
strcpy( a[i][0], item );
strcpy( a[i][1], item2 );
printf("word %s \nmeaning: %s\n", a[i][0], a[i][1] );
}
}
此声明
char *a[5][1];
声明一个多维指针数组。您需要保留存储器复制字符串的位置。
数组的索引从0开始。
答案 2 :(得分:0)
您尚未初始化a
数组中的值,因此您无法使用它们。当您致电strcpy
时,您将a[0][0]
的值作为要复制数据的地址传递给它 - 但它没有特定值,因为您没有将其设置为任何值。所以你要求strcpy
将字符串复制到任何地方。
在尝试使用其值之前,必须为变量赋值。在尝试使用指针的值之前,必须使指针指向某个东西,就像它指向某个东西一样。
你可以这样做:
a[i][0] = strdup (item);
strdup
函数分配内存并将字符串复制到该内存中,并返回指向它的指针。在此之后,a[i][0]
将指向包含该字符串副本的新分配的内存。
如果您的平台未提供strdup
,则可以轻松对其进行编码:
char *strdup (const char * i)
{
char *j = malloc (strlen(i) + 1);
if (j == NULL)
return NULL;
strcpy (j, i);
return j;
}
您也可以在结束时访问数组。您的数组只有五个对象,索引为0,1,2,3和4.所以使用索引5也是非法的。
最后,在scanf
来电中,您传递字符数组的地址,如下所示:scanf("%s",&item);
。由于item
是一个数组,它会衰减到第一个元素的地址,这就是你想要的。您不需要数组的地址,因此&
不正确。