strcpy 错误 return 未响应 window

Error in strcpy return not responding window

此代码是制作简单词典的先行者。我试图将单词和含义插入数组。似乎是什么问题?

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

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

您的循环应如下所示:

for (int i =1;i <5 ; i++){

请注意 < 而不是 <=。如果声明一个大小为 5 的数组,则最后一个元素位于索引 4 处。

此外,将 a 初始化为 a[5][2][100] 而不是 *a[5][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开始