我在这里基于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;
}
答案 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)
答案 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
动态分配字符缓冲区。
strlen
来计算该长度。malloc
,记住为null终止符添加一个字符。 strcpy
或strcat
来构建字符串。system
。free
(如果您的流程即将终止,请不要打扰)。