在c中构建字符串的方法

时间:2012-01-30 19:44:59

标签: c strcat

我在这里基于4个参数构建一个字符串并用system()调用它,但是我的方式看起来有点混乱。有没有更正确的方法我应该这样做而不是使用所有那些strcat和str1-4?

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

int main(int argc, char *argv[])
{

    char str1[40] = "sed -n 's/.*\\(";
    char str2[] = "\\)\\(.*\\)\\(";
    char str3[] = "\\).*/\\2/p' ";
    char str4[] = " > ";

    if (argc != 5)
    {
        fprintf (stderr, "Usage %s <LogFile> <token1> <token2> <DumpFile>\n",
                argv[0]);
                exit(EXIT_FAILURE);
    }

    strcat(str1, argv[2]);
    strcat(str1, str2);
    strcat(str1, argv[3]);
    strcat(str1, str3);
    strcat(str1, argv[1]);
    strcat(str1, str4);
    strcat(str1, argv[4]);

    system(str1);

    return 0;
}

6 个答案:

答案 0 :(得分:8)

您的代码的一个问题是您没有检查适合40个字节的参数。

我可能会使用snprintf

snprintf(str, LENGTH, "sed -n 's/.*\\(%s...", argv[2]...);

答案 1 :(得分:3)

这可以节省重复strcat()的二次行为。 OTOH,如果你拨打system(),就会在噪音中丢失。

char str1[4096];
char str0[] = "sed -n 's/.*\\(";

sprintf(str1, "%s%s%s%s%s%s%s%s", str0, argv[2], str2, argv[3], str3, argv[1], str4, argv[4]);

如果你担心缓冲区溢出,你可以使用snprintf()(你应该这样; str1中的40个字节是不够的;你将96离开了,就像在{{1 }})。您可以检查返回值以查看已写入的字符数。

答案 2 :(得分:2)

总有sprintf会让您的生活更轻松。确保如果使用sptrintf,则缓冲区足够大以获得结果。还有一个更安全的版本snprintf,它将为您进行边界检查。

答案 3 :(得分:2)

唯一的问题是你可能会遇到缓冲区溢出(如果输入太长)。修复它,检查字符串的长度(使用strlen),并分配足够的内存来包含你想要的字符串。

分配足够的内存后,您可以使用循环,或让sprintf为您完成工作。

答案 4 :(得分:2)

str1只有40个字节长,而且你要为它添加太多数据。可能发生堆栈溢出。我愿意:

char buffer[1000]; // Choose a reasonable size
snprintf(buffer, sizeof(buffer),
    "sed -n 's/.*\\(%s\\)\\(.*\\)\\(%s\\).*/\\2/p' %s > %s",
    argv[2], argv[3], argv[1], argv[4]);

答案 5 :(得分:1)

如果您希望代码处理任意长的参数,那么您需要使用malloc动态分配字符缓冲区。

  1. 创建一个局部变量来计算所需的总长度,并使用重复调用strlen来计算该长度。
  2. 调用malloc,记住为null终止符添加一个字符。
  3. 多次使用strcpystrcat来构建字符串。
  4. 致电system
  5. 致电free(如果您的流程即将终止,请不要打扰)。