【问题标题】:Buffer Overflow when using strcpy function使用 strcpy 函数时的缓冲区溢出
【发布时间】:2014-07-22 09:10:47
【问题描述】:

我正在尝试使用 strcpy 将字符串放入字符串数组中。 这是我对数组的定义:

char movies[10][150], movie[150];
int i = 0, j = 0;

currentChar = getchar();

while(currentChar != EOF)
{
    while(currentChar!='\n')
    {
        movie[i] = currentChar;
        currentChar = getchar();
        i++;
    }

    strcpy(*(movies + j*10*15), (char*)movie);
    j++;
    currentChar = getchar();
}

尝试在 c++ 控制台中调试它,我收到“缓冲区太小”消息。

注意:我的输入是 “未刮胡子的姜戈:有点血腥,但总体上是一部扎实的电影” 不超过 150 个字符。

感谢您的帮助。

编辑:编辑代码以显示完整图片

【问题讨论】:

  • 目的地应该是*(movies + j)?
  • 嗨,我应该提到 strcpy 处于一个 while 循环中,它应该将字符串放入 movies[j][0]
  • @user3698757 如果有相关代码未显示,请编辑问题并添加。
  • 是的,但movies[j][0] 只是一个字符。你想要movies[j],它是一个 150 个字符的缓冲区。第一个索引指向字符串数组中的字符串/电影标题,第二个索引指向该字符串中的字符。 (如果它没有超出终止的空值,那就是。)

标签: c string strcpy


【解决方案1】:

最后我解决了这个问题。显然,在 'movie' 的末尾没有 '\n' 字符,strcpy 无法处理它。

在字符串末尾添加一个 '\n' 即可解决问题。

【讨论】:

    【解决方案2】:

    您应该改用此代码:

    strcpy(movies[j], movie);
    

    恕我直言,定义一个二维数组然后将其用作定义为 char[1500] 的大型一维数组是没有意义的。

    另外,您正在使用哪个编译器为C-code 生成这样的消息?

    【讨论】:

    • 这比做裸指针算法更不容易出错,而且更容易阅读。此外,如果更改了字符串的存储,可能是为了节省空间或删除 149 长度限制,则只需更改电影声明,而不需要更改此代码。
    【解决方案3】:

    您的复制函数调用应该是:

    strcpy((movies + j*150), (char*)movie);
    

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多