【问题标题】:c system function gets before other strings [closed]c系统函数先于其他字符串[关闭]
【发布时间】:2016-07-14 00:43:22
【问题描述】:

我正在尝试编写一个简单的 c 程序来打印 C 编译器版本。所以我写道:

#include <stdio.h>
int main() {
    printf("you have %d", system("gcc --version");
}

输出:

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

you have compiler 0

有什么想法吗?

【问题讨论】:

  • 你有什么问题?
  • 你读过system man page吗?它告诉您system 的返回值是什么?
  • 您可能想要发布产生输出的实际代码,而不是模糊相似的东西。另外,请阅读 system() 的手册页。
  • 我怎样才能把它写成正确的顺序?我的意思是它会打印出类似的内容:你有编译器你有 gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4 版权所有 (C) 2013 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不是为了适销性或适合特定目的。
  • 对于初学者来说,不要使用system,因为它并没有达到你想要的效果。请改用popen。或者您可以在printf 之后 运行system。并使用您的上述评论编辑您的问题,因为它解释了您真正要问的问题。

标签: c system


【解决方案1】:

system 执行一个 shell 命令并返回命令的状态。与您的情况一样,值为 0 表示命令已成功运行。

【讨论】:

    【解决方案2】:

    您对printf 的调用正在打印system 调用的返回值。系统调用的返回值,根据man page,就是被调用命令的返回状态(本例中为gcc)。

    由于gcc调用成功,返回值为'0'。那么,这就是您的程序打印的值:

    you have compiler 0
    

    【讨论】:

      【解决方案3】:

      像这样:

      #include <stdlib.h>
      #include <stdio.h>
      
      int main() {
          FILE* fp;
          unsigned major, minor, build;
          system("gcc --version > gccoutput.txt");
      
          fp = fopen("gccoutput.txt", "r");
          if (fp) {
              fscanf(fp, "gcc (GCC) %u.%u.%u", &major, &minor, &build);
              printf("Major: %u, minor: %u, build: %u\n", major, minor, build);
              fclose(fp);
          }
      }
      

      我的输出是 gcc (GCC) 4.6.2 等

      因此,对于您的输出,您必须进行更改。或者让它在 x.y.z 之前的任何字符串上工作

      更灵活的解决方案可以使用:

      fscanf(fp, "%[A-Za-z() ]%u.%u.%u", s, &major, &minor, &build);
      

      s 是一个字符缓冲区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-27
        • 2019-04-26
        • 1970-01-01
        • 2013-08-01
        • 2019-03-01
        • 2020-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多