【问题标题】:strcpy copies content of an other arraystrcpy 复制另一个数组的内容
【发布时间】:2015-05-12 10:48:38
【问题描述】:

所以我有这段代码可以将 char 数组转换为结构的内容。 (不,我不会争论这是否是正确/最有效的方法)

void chararray_to_categorie(categorie &levarr, char** chararray)
    {


        string temp = chararray[0];
        int length = temp.length();
        temp = temp.substr(0, ((length<21)?length:20));

        strcpy(levarr.naam, temp.c_str()); //a very sloppy way to use substring on a char array. Tried memcpy and that caused the same results which is why I'm trying it this way.
        levarr.naam[20] = '\0';

        strcpy(levarr.omschrijving, chararray[1]);


        cout << endl << chararray[0] << endl << temp << endl << levarr.naam << endl << length << endl << ((length<21) ? length : 20);
        _getch();

        /*
        input:
        naam: 1234567890123456789012345678901234567890
        omschrijving: lol

        output:
        chararray[0]: 1234567890123456789012345678901234567890
        temp: 12345678901234567890
        levarr.naam: 12345678901234567890lol

        */

    }

正如您在输出中看到的那样,您可以看到结构的内容组合了 2 个字符数组,这就是问题所在。

【问题讨论】:

  • 显示结构的定义。
  • typedef struct { int ID; char naam[20]、omschrijving[50]; }类别;

标签: c++ arrays string char


【解决方案1】:

您的代码中有很多不理想的地方,但错误归结为:

levarr.naam[20] = '\0';

应该是

levarr.naam[19] = '\0';

因为数组从 0 开始计数;

其他需要解决的问题:

  • 使用以 NULL 结尾的字符串并具有大小参数的保存 strcpy 函数,它可以保护您免受此问题的影响。
  • 不要获取子字符串,使用安全函数从原始字符串中复制那么多字符。

【讨论】:

  • 试图用 strncpy 重新制作它,因为我认为这就是你建议的“安全函数”虽然同样的情况仍然发生,那就是 chararray[1] 仍然被复制到 levarr.naam 这应该仅包含 chararray[0]。 strncpy(levarr.naam, chararray[0],20); levarr.naam[19] = '/0'; 实际上同样发生在 levarr.naam[20] = '/0';
  • @Semanresu 我小心不要说strncpy,因为它不会以NULL 终止字符串,顺便说一句,NULL 终止是\0 而不是/0
  • 哦错过了,谢谢问题解决了。虽然唯一的缺点是这将占用数组中的最后一个插槽,但有解决方法吗?
  • @Semanresu 并非如此,扩大数组是唯一明智的选择。
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多