strcpy返回错误没有响应窗口

时间:2016-05-13 15:42:36

标签: c strcpy

这段代码是制作简单字典的先行者。即时尝试将单词和含义插入数组中。看来问题是什么?

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

3 个答案:

答案 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是一个数组,它会衰减到第一个元素的地址,这就是你想要的。您不需要数组的地址,因此&不正确。