代码之家  ›  专栏  ›  技术社区  ›  edi9999

如何使用strcpy将字符串复制到字符串数组中?

  •  2
  • edi9999  · 技术社区  · 13 年前

    我试图将一个字符串复制到一个字符串数组中,但它不起作用。我知道这是由于内存分配造成的问题,但我不知道如何使其工作,因为STRING_LENGTH是一个常数。

    #define NUMBER_OF_STRINGS 3
    #define STRING_LENGTH 255
    char message_ecran[NUMBER_OF_STRINGS][STRING_LENGTH];
    
    int i;
    char texte3[] = "CVC";
    char texte7[] = "iiiiiiiii";
    
    for (i=0;i<=NUMBER_OF_STRINGS;i++)
    {
        strcpy(message_ecran[i], texte7);
    }
    strcpy(message_ecran[0], texte3);
    

    代码后的message_ecran值:

    "CVC"
    null
    "iiiiiiiii"
    

    期望值

    "CVC"    
    "iiiiiiiii"
    "iiiiiiiii"
    
    3 回复  |  直到 13 年前
        1
  •  4
  •   NPE    13 年前

    一个问题是你跑过了 message_ecran 在以下循环中:

    for (i=0;i<=NUMBER_OF_STRINGS;i++)
    

    自从 message_ecran[NUMBER_OF_STRINGS] 越界,试图 strcpy() 结果 undefined behaviour .

    编辑 关于你的编辑,我无法重现这个问题。当我将以下内容添加到您的最新代码中时:

    for (i = 0; i < NUMBER_OF_STRINGS; i++) {
      printf("%d:[%s]\n", i, message_ecran[i]);
    }
    

    打印出来

    0:[CVC]
    1:[iiiiiiiii]
    2:[iiiiiiiii]
    
        2
  •  2
  •   hmjd    13 年前

    代码在访问时超出了此行的数组边界,因此具有未定义的行为:

    for (i=0;i<=NUMBER_OF_STRINGS;i++)
    

    因为数组索引是从零开始的,并且从 0 N - 1 哪里 N 是数组中的元素数。这意味着的有效数组索引 message_ecran 0 1 只是,但是 2 将用作中的索引 for 环更改为:

    for (i=0;i<NUMBER_OF_STRINGS;i++)
    
        3
  •  0
  •   SureshS    13 年前

    此外,你可以从1开始循环

    for (i = 1; i < NUMBER_OF_STRINGS; i++)
    

    因为您稍后将在第零个位置分配“texte3”。