【问题标题】:C Progam parser for ubuntu?ubuntu的C程序解析?
【发布时间】:2014-11-05 11:11:02
【问题描述】:

所以我必须用 C 语言构建一个程序,该程序实际上从键盘获取命令,将其拆分为存储在数组中的标记,并将这些标记用作“execv”(ubuntu 中的命令)的输入,我选择了带有参数“-a”的命令“uname”,但我被困在数组存储中,因为它只存储被拆分的令牌的第一个字母。

#include <stdio.h>
#include<stdlib.h>
#include <string.h>   /*strtok strcpy*/
#include<malloc.h>   /*malloc*/
#include <sys/types.h> /* pid_t */
#include <sys/wait.h>  /* waitpid */
#include <unistd.h>    /* _exit, fork */

int main()
{
    int i=0;
    char *cuvinte[256]; // words
    char comanda[256];  //command

    printf("Introduceti comanda: "); //enter the command
    fgets(comanda,sizeof(comanda),stdin); // read the command
    char *c = strtok(comanda," "); // split it into tokens

    while(c!=0)
    {
        cuvinte[i] = malloc( strlen( c ) + 1 ); // alocate memory for the array
        strcpy(cuvinte[i++],c); //copying tokens into array
        printf("%s\n",c); // printing them
        c=strtok(NULL, " ,.!?");
        }
    printf("Sunt %d elemente stocate in array! \n\n",i); //no of tokens stored
    printf("Primul cuvant este: \n\n\n"+*cuvinte[1]); //should print the first word


    /*i got stucked here because of the tokens */ 

/*face un proces copil*/
      pid_t pid=fork();
        if (pid==0) { /* procesul copil*/
        static char *argv[]={"/bin/uname","-a",NULL};
        execv(argv[0],argv);
        exit(127); /*in caz ca execv da fail*/
        }
        else { /* pid!=0; proces parinte */
        waitpid(pid,0,0); /* asteapta dupa copil */
        }
    //getch();
    return 0;
}

【问题讨论】:

  • 在 C 中,您不能将字符串与 + 连接。你的打印命令应该是printf("Primul cuvant este: %s\n", cuvinte[1]);

标签: c parsing ubuntu


【解决方案1】:

我认为您的问题是printf("Primul cuvant este: \n\n\n"+*cuvinte[1]); 声明。这将取消引用 cuvinte 中第二项的第一个字符。我认为你想做的是printf("Primul cuvant este: %s \n\n\n",cuvinte[0]);

Live version.

【讨论】:

  • @AlexandruIanas:然后继续努力,一旦你被卡住了一段时间,就发布另一个问题。
  • @LightnessRacesinOrbit 我编辑了这个问题,所以我不会再放另一个和垃圾邮件,因为我 100% 确定它又是一个小错误,如果你查看我添加了我在第一个下面的代码!
  • @AlexandruIanas:不,请不要那样做。这不是一个论坛 - 每个问题一个问题,之后不要从根本上改变它!我恢复了你的编辑。像我说的那样提出一个新问题,或者,如果你认为这只是一个小错误,你最好找个聊天室来提问。
  • @LightnessRacesinOrbit 好的,对不起,我会接受你的建议,我会继续努力,如果我不能让它工作,我会发布一个新问题,我也会为我生疏的英语道歉,如果我做了什么错误的。谢谢!
【解决方案2】:

您正在将 strtok 的输出(通过指针)分配给单个字符变量。

【讨论】:

  • “现在正在重新学习 C,以便为 C++ 在 Core2Quad 上使用 Kubuntu 编写我自己的工具/玩具打下基础。” 哎呀!如果你想学 C++,那就学 C++;不要因为先学习 C 而毁了它。 C 没有给你 C++ 的基础:它教你完全不同和不恰当的习语。
  • 我在 1990 年学习了 ANSI C;我有参考资料,我记得很多,但我没有地方开始学习 C++——如果它与 ANSI C 有那么大的不同,那就像是试图自学汇编程序,只知道一点 BASIC。在我跳入 GUI、对象和继承等 (IMO) 之前,我已经准备好再次进行舒适的编程了。
  • 老实说,如果您的最终目标是最终使用 C++,最好从不同的语言(不是 C)学习基础知识。 C会误导你!
  • 我不是试图通过重新学习 C 来“学习 C++ 的基础知识”,而是试图恢复编程的思维方式和一般的“逐步”思维过程。然而,如果 C++ 如此背离 C(几乎是经典编程的缩影),我很想提出建议,那么某人(早在 1990 年左右)可能应该给它取个不同的名字……
  • 是的,我明白你在说什么。而且,是的,如果 Mascitti 知道 C++ 的习语和语义与 C 的差异有多大,比 first 标准早八年,我敢肯定他会称它为别的东西。 (实际上,这个名称是在 1983 年首次使用的,比它早了 15 年。)它确实在一定程度上是有道理的,因为 C++ 是从 C 演变而来的。然而,那是与说学习 C 为 C++ 提供任何有用的基础不同。它没有——恰恰相反。为了在学习 C++ 之前重拾你的编程魔力,我建议使用 Python 之类的。
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多