使用 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(对于 systempopen

关于 C 中的字符串操作,了解 snprintf(3) (but avoid using sprintf) or, on Linux with glibc, asprintf(3)