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开始
此代码是制作简单词典的先行者。我试图将单词和含义插入数组。似乎是什么问题?
#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开始