使用 main 中给出的参数在 C 中进行字符串解析
String Parsing in C with an argument given in main
我在 main 中传递一个参数,并想将该参数包含在其中一行代码中。我很难将它合并到代码中。
这是代码:
int main(char *argv[])
{
FILE *in;
char buff[512];
// char temp [512];
// /nfs/engfs/haquresh/Desktop -> should be argument given in main
// " find argv[] -type f | wc -l", "r" this is want i want stored in a char temp
if (!(in = popen("find /nfs/engfs/haquresh/Desktop -type f | wc -l", "r")))
{
return 1;
}
它应该是 C 中的基本字符操作,我只是很难用它。任何帮助,将不胜感激。
请记住,调用任意参数作为代码的程序可能是一个严重的安全问题。
/* popen1.c */
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
FILE* fin;
int i;
char cmd[ 4096 ];
if (argc < 2) {
printf("Must specify arguments\n");
return -1;
}
sprintf(cmd, "find %s |wc -l", argv[1]);
fin = popen(cmd, "r");
if (!fin) {
perror("popen");
return -1;
}
while(!feof(fin)) {
if (fgets(line, sizeof(line), fin) != NULL)
printf("%s", line);
}
pclose(fin);
return 0;
}
编译为cc -opopen1 popen1.c
。
运行 因此:./popen1 /nfs/engfs/haquresh/Desktop
我会避免 运行 来自您的 C 程序的任何 find
进程,因为您可以(并且可能应该)使用 nftw(3) 函数来搜索您的树。
使用 nftw
在内部进行搜索会避免一个过程。顺便说一句,| wc -l
的功能在 C 中编程也非常简单。
如果你坚持运行一个管道,你不需要编写C程序;你可以制作一个 shell 脚本,比如
#!/bin/sh
find $* -type f | wc -l
这比您的 C 程序更短(但不慢);在用 C 编写动态构建的命令字符串时害怕 code injection(对于 system
或 popen
)
关于 C 中的字符串操作,了解 snprintf(3) (but avoid using sprintf
) or, on Linux with glibc, asprintf(3)
我在 main 中传递一个参数,并想将该参数包含在其中一行代码中。我很难将它合并到代码中。 这是代码:
int main(char *argv[])
{
FILE *in;
char buff[512];
// char temp [512];
// /nfs/engfs/haquresh/Desktop -> should be argument given in main
// " find argv[] -type f | wc -l", "r" this is want i want stored in a char temp
if (!(in = popen("find /nfs/engfs/haquresh/Desktop -type f | wc -l", "r")))
{
return 1;
}
它应该是 C 中的基本字符操作,我只是很难用它。任何帮助,将不胜感激。
请记住,调用任意参数作为代码的程序可能是一个严重的安全问题。
/* popen1.c */
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
FILE* fin;
int i;
char cmd[ 4096 ];
if (argc < 2) {
printf("Must specify arguments\n");
return -1;
}
sprintf(cmd, "find %s |wc -l", argv[1]);
fin = popen(cmd, "r");
if (!fin) {
perror("popen");
return -1;
}
while(!feof(fin)) {
if (fgets(line, sizeof(line), fin) != NULL)
printf("%s", line);
}
pclose(fin);
return 0;
}
编译为cc -opopen1 popen1.c
。
运行 因此:./popen1 /nfs/engfs/haquresh/Desktop
我会避免 运行 来自您的 C 程序的任何 find
进程,因为您可以(并且可能应该)使用 nftw(3) 函数来搜索您的树。
使用 nftw
在内部进行搜索会避免一个过程。顺便说一句,| wc -l
的功能在 C 中编程也非常简单。
如果你坚持运行一个管道,你不需要编写C程序;你可以制作一个 shell 脚本,比如
#!/bin/sh
find $* -type f | wc -l
这比您的 C 程序更短(但不慢);在用 C 编写动态构建的命令字符串时害怕 code injection(对于 system
或 popen
)
关于 C 中的字符串操作,了解 snprintf(3) (but avoid using sprintf
) or, on Linux with glibc, asprintf(3)