c - 这是对 strcpy() 功能的误解吗?

标签 c

#include <stdio.h>
#include <string.h>
int main(void) {
    int number_of_members;

    char family[number_of_members][20][number_of_members][20];
    char member_name[20];
    char birth_state[20];
    char family_last_name[20];

    printf("What is the last name of the family?\n");
    scanf("%s", &family_last_name);

    printf("How many members do you want to create?\n");
    scanf("%d", &number_of_members);

    int const FAMILY_SIZE = number_of_members;

    number_of_members = number_of_members -1;
    printf("Enter the family member name: \n");

    for(number_of_members;number_of_members>-1;number_of_members--)
    {

        scanf("%s", &member_name);
        strcpy(family[number_of_members], member_name);


        printf(" %d %s %s\n",number_of_members, member_name, family_last_name);

    }
    printf("%s, %s ", family[0], family[1]);
    return 0;
}

这是输出:(来自 Ideone.com)

Ideone.com with code

此代码的输入是:Layne、2、tim、jim。

运行时,它会显示数组中名称的正确索引,但是一旦退出,它将显示最后输入的名称 jim,如 family 1和家人[0]。我不明白 strcpy() 是如何工作的吗?或者这是一个逻辑错误?我们将不胜感激!

最佳答案

这是非常非常错误的

int number_of_members;
char family[number_of_members][20][number_of_members][20];
  1. 因为您尚未初始化 number_of_members
  2. 因为它没有任何意义,所以您不可能真正需要这种数组。

是的,如果你启用编译器警告,它会用棍子打你的 Nose ,因为

strcpy(family[number_of_members], member_name);

甚至不应该编译,并且是未定义的行为,因为 family[number_of_members] 的类型是 char 数组的数组的数组。

strcpy 可以采用 char 数组,因为它会自动转换为 char 指针,并且前提是数组符合 c 字符串,那么 strcpy() 将正常工作,在您的情况下,行为未定义,因为几乎可以肯定 '\0' 永远不会被发现在目标指针中。

关于c - 这是对 strcpy() 功能的误解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927469/

相关文章:

c - uint8_t 双指针的段错误

c - 函数调用之间的内存保留,无需 static 或 malloc

c++ - 矩阵的平均四分之一

c - 反转C样式字符串-运行时错误

c - 指针语法困惑

c++ - 将 Opus 与 PortAudio 结合使用

像液晶一样为 Arduino 库创建 Simulink block

c - 如何知道用户按下了哪个键?

使用套接字 C 编译函数警告

mysql - Windows 下最基本的 MySQL UDF 代码