c - 这个功能有什么问题?

标签 c find

我今天遇到了一个问题。它有一个方法,我需要在那个函数中找到问题。该函数的目的是将新行附加到传递的字符串。以下是代码

char* appendNewLine(char* str){
    int len = strlen(str);
    char buffer[1024];
    strcpy(buffer, str);
    buffer[len] = '\n';
    return buffer;
}

我已经确定了这个方法的问题。它有点直截了当。该方法有可能使数组的索引超出范围。那不是我的怀疑。在 java 中,我使用 '\n' 作为换行符。 (我基本上是一名 Java 程序员,我已经在 C 中工作了很多年)。但是我依稀记得 '\n' 是表示 C 中字符串的终止。这也是这个程序的问题吗?

请指教。

最佳答案

这段代码中有不少问题。

  1. strlen 而不是 strlent,除非你有一个奇怪的库函数。
  2. 您正在堆栈上定义一个静态缓冲区。这是一个潜在的错误(也是一个安全错误),因为在一行之后,您将字符串复制到它而不检查长度。 可能的解决方案可以是在堆上分配内存(结合使用 strlen 和 malloc),或者使用 strncpy 并接受字符串的截断。
  3. 附加 '\n' 确实解决了添加新行的问题,但这会产生一个进一步的错误,因为该字符串当前不是空终止的。 解决方案:追加 '\n' 和 '\0' 以 null 终止新字符串。
  4. 正如其他人所提到的,您正在返回一个指向局部变量的指针,这是一个严重的错误,会导致返回值在短时间内损坏。

为了加深您对这些问题的理解,请查看什么是 C 风格的字符串,可能来自 here .此外,自学分配在堆栈上的变量和分配在堆上的变量之间的区别。

已编辑:AndreyT 是正确的,长度的定义是有效的

关于c - 这个功能有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348234/

相关文章:

c - Fscanf 没有将文件中的 float 正确读取到链表中

shell - UNIX 脚本 - 查找文件 - 显示日期

recursion - 在文件夹上递归执行 Latexmk -c

linux - 使用 or 运算符查找

c++ - 使用gcc编译c/c++程序

c - For循环增强但有歧义

c - 在 C 中读取 .csv 文件

C语言的邻居查找程序代码

unix find 命令结果中的权限问题

perl - 使用 Perl 查找文件