【问题标题】:How to prevent strcpy from overwriting another variable as well?如何防止 strcpy 也覆盖另一个变量?
【发布时间】:2023-03-21 08:14:01
【问题描述】:

我正在尝试编写一个简单的代码,将一种类型的数据转换为另一种类型的数据。我使用strtok 提取一部分数据,然后运行一长串if 条件以找到正确的输出。但是,当找到正确的输出并将其写入变量currentNote 时,它似乎也覆盖了变量comma,原因我无法弄清楚。这是代码的问题部分:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char sequence[] = "c1[M],c1[M],d3[L],c3[M],b2[M],(#A-2)[IKN],(#A-1)[L]";
    char copy[] = "";
    char *comma;
    char currentNote[4] = "";

    strcpy(copy, sequence);

    comma = strtok(copy, ",");

    if(strstr(comma, "c1") != 0)     //c1
        {
                printf("%s\n\n", comma);          //Here ...
                strcpy(currentNote, "C5 ");
                printf("%s\n\n", comma);
        }
    return 0;
}

结果如下:

c1[M]

cC5

不用说是strcpy(currentNote, "C5 "); 造成的。我不知道为什么,我认为它会像我希望的那样返回c1[M]。经过更多的实验,结果证明第二个printf("%s\n\n", comma); 将始终返回sequence 的第一个字符,然后是C5。我希望有人能发现,这将是非常棒的。

【问题讨论】:

  • 也许给copy一些内存来存储东西
  • 那不编译。 currentNote 声明在哪里?
  • strcpy(copy, sequence) 不好。 copy 没有足够的空间。
  • 我会试试看,感谢您的快速回答。哦,我好像忘记添加了,我去编辑一下。
  • @d3l:你说“做n't”?

标签: c string overwrite strcpy


【解决方案1】:

您正在调用
strcpy(copy, sequence)copy 是一个 1 元素长度数组。您需要通过给它足够的大小来定义它。您的代码原样只是一个 UB。像这样重新定义它

char copy[100];

或者使用malloc动态为其分配足够的内存。

【讨论】:

  • 感谢@chux。永远感谢您的反馈。刚刚编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2018-06-06
  • 1970-01-01
  • 2016-10-16
  • 2011-08-31
相关资源
最近更新 更多