【问题标题】:passing arguments to main将参数传递给 main
【发布时间】:2012-03-03 18:52:04
【问题描述】:

我知道这是相当基本的,但我仍然卡住了。 所以我有一个函数需要接受一个变量n,所以这是我的主要函数

int main(int argc, char* argv){
  sort(argv[1]);
    }

我这样调用程序:

    ./sort 4 <text.txt

但是数字 4 没有被识别或传递给函数。我究竟做错了什么?我知道 argv[0] 应该保存程序本身的名称,并且从那里开始的每个程序都应该保存参数。

【问题讨论】:

  • main的第二个参数是char** argv,或者char *argv[],因为它是一个字符串数组。
  • 哎呀我的错误。我修复了它,但它仍然无法正常工作。我正在调试它,由于某种原因,argv[1] 为 0..
  • 在类 Unix 系统上,&lt;text.txt 将由 shell 解释,而不是由程序解释。该信息不会传递给sort 程序。

标签: c main


【解决方案1】:

您应该尝试将它们全部打印出来。

#include <stdio.h>

int main(int argc, const char *argv[])
{
    int i = 0;
    for (; i < argc; ++i) {
        printf("argv[%d] = '%s'\n", i, argv[i]);
    }
    return 0;
}

使用./a.out 4 &lt; /somefile 运行该代码会给我:

argv[0] = './a.out'
argv[1] = '4'

最终,您必须记住,“4”是指向字符数组的指针,您可能必须将其解析为整数。

【讨论】:

  • 我仍然很困惑,您发布的代码段正确显示了参数,但它仍然没有正确传递给函数。这是为什么?为什么 sort(argv[1]) 不起作用?
  • @JonathanLeffler here ./a.out 4 &lt; /somefile 应该将somefile 的内容读入argv 对吧?
  • @overexchange:不。如果您希望文件的内容作为参数,您必须在 Bash 中执行 ./a.out 4 $(&lt;/somefile) 或在其他现代 POSIX-ish shell 中执行 ./a.out 4 $(cat /somefile) 之类的操作。然后,您将在文件中为每个“单词”获得一个参数。你可以使用./a.out 4 "$(cat /somefile)" 来确保你只得到两个参数。您编写的内容将重定向标准输入,因此它来自文件而不是终端。
  • @JonathanLeffler 我在file.txt 中有记录,每条记录都应该是argv 的一个元素。目前是fopen()ing file.txt 如图here
  • @overexchange:这很快就会变得非常棘手。 “记录”是一行还是一行的一部分或一组行?你怎么知道你什么时候有“记录结束”?下一个问题是让 shell 在记录末尾拆分参数。默认情况下,shell 使用空白或制表符或换行符。要在换行符上拆分文件中的行,您可以使用:(IFS=$'\n'; printf '%s\n' $(cat file) ),其中外圆括号创建一个子 shell,以保护您免受代码内IFS 的更改。这会在文件的行中保留空格——前导空格、尾随空格、多个空格。
【解决方案2】:

char *argv 不正确。你得到了一个char*(“字符串”)的数组,所以声明main的正确方法是int main(int argc, char *argv[])或等效的int main(int argc, char **argv)(在后一种情况下,数组参数被有效地转换为指向数组的第一个元素)。

您在当前版本的代码中检索的是环境给您的参数指针数组中的第二个char,该数组被重新解释为字符数组,这完全是另外一回事。

【讨论】:

    【解决方案3】:

    正如其他人所描述的,您知道如何获取所有参数,但不知道“

    这不是你的程序的参数,而是 shell 的参数。这是输入重定向,意味着文件的输入就像来自标准输入(键盘)一样进入程序。

    为了防止这种情况,只需像这样调用你的程序:

    ./sort 4 text.txt
    

    我不确定您调用的“排序”函数是什么。

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 2014-06-28
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2016-11-19
      • 2016-04-16
      相关资源
      最近更新 更多