【问题标题】:Find the output of a C program [closed]查找C程序的输出[关闭]
【发布时间】:2013-12-05 00:16:36
【问题描述】:

我一直在尝试解决这个问题,但无法理解。 如果以下程序(myprog)从命令行运行为:

myprog friday tuesday sunday

输出会是什么?

#include<stdio.h>
int main(int argc, char *argv[]){
    while(sizeof argv)
         printf("%s",argv[--sizeof argv]);
    return 0;
}

输出是-

sunday tuesday friday myprog

请解释一下输出。 谢谢:-)

【问题讨论】:

  • --sizeof argv 是非法的。所以你的程序不能从命令行运行,因为它甚至无法编译。
  • 输出应该类似于“错误:无法将-- 应用于右值”。
  • 即使编译成功了,运行时会陷入死循环,超出argv范围时会崩溃。 while(sizeof argv) 不会终止。
  • 代码无法编译。请检查您的代码并编辑发布的问题。

标签: c output command-line-arguments


【解决方案1】:

错误:

需要作为减量操作数的左值

它无法编译。

sizeof 是一个类似于+% 的运算符,它为您提供对象的大小。所以,你不能减少它。就像这样的事情没有任何意义:--%

问题的要点是:

如果输入是:myprog friday tuesday sunday 会发生什么

当代码执行时:

index = lastIndex
while(index) // note: while(0) == false
    print(array[--index])

因此,输出将是元素的反转:

周日周二周五

【讨论】:

【解决方案2】:

忽略 --sizeof 问题,我假设您想了解 argv 的元素。 它包含程序的参数和名称。阅读任何描述 argv 的手册或文档。

【讨论】:

    【解决方案3】:

    您的代码中有两个问题:

    1. --sizeof argv is illegal。这会导致错误。

    2. while(sizeof argv) 将导致无限循环,因为条件始终为真

    所以简而言之,代码不会编译,会导致错误。

    【讨论】:

      【解决方案4】:

      我猜你真的是这个。它只是向后打印命令行参数。

      #include<stdio.h>
      
      int main(int argc, char *argv[])
      {
          while (argc)
              printf("%s ", argv[--argc]);
      
          printf("\n");
      
          return 0;
      }
      

      【讨论】:

      • thanx 但是当 argc 变为 0 时, while(0) 意味着 false 那么为什么要打印 myprog 。它会一直打印到星期五。
      • 因为它使用的是pre-decrement。当argc 为1 时,argv[--argc]argv[0]
      • 因为 --argc.它在 while 循环计算为 0 之前打印 argv 的 3,2,1,0 个元素。
      【解决方案5】:

      您可能想了解 C 中的命令行参数处理。例如,当您获得一些程序参数列表时,

      myprog friday tuesday sunday
      

      C 语言为 main() 函数提供参数,该函数提供参数的数量(本例中为 4 个),以及指向这些参数的 char*(指针)数组。

      请注意,sizeof argv 是在编译时计算的,其值是系统上指针的大小(4 或 8)。

      首先,我们解释一下主函数的参数,

      int main(
          int argc, //an integer count of the number of arguments provided to the program
          char* argv[] //an array of pointers to character arguments
      )
      

      然后你的 main 函数被定义为(显然)打印出从最右边的参数开始并返回到第零个参数的参数,

      {
          int argv_sizeof = argc; //you cannot use sizeof argv the way you specified
          //argv_sizeof = 4 in your example, but argv[4] is not valid
          //argv_sizeof has a value that is one past the rightmost element of argv[]
          while( argv_sizeof ) //use argv_sizeof > 0 here; argv_sizeof is 4,3,2,1,0
                               //when argv_sizeof reaches 0, the while loop terminates
          {
              printf("%s",argv[--argv_sizeof]); //here you pre-decrement argv_sizeof (3,2,1,0)
              //then use argv_sizeof to index into argv[]
              //then you print the string at argv[3], argv[2], argv[1], argv[0]
          }
          //argv_sizeof = 0 here
          return 0; //you return the value 0 from the main function
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 2022-12-31
        • 1970-01-01
        • 2017-01-23
        相关资源
        最近更新 更多