【问题标题】:Using main(int arc, char *argv[])?使用 main(int argc, char *argv[])?
【发布时间】:2020-09-03 19:19:39
【问题描述】:

我对这段代码有几个问题。首先,使用 swap 函数,我们是否因为更改了地址内部的值而取消了 ptr1 和 ptr2 的引用,而不是直接交换地址本身?其次,对于 main 函数,我如何将 num1 和 num2 设置为等于在命令行中给出的输入。例如,“./a.out 5 10”,其中 num1 =5 且 num2 = 10。谢谢

#include <stdio.h>

void swap(int *ptr1, int *ptr2)
{

  int temp;
  temp = *ptr1;
  *ptr1 = *ptr2;
  *ptr2 = temp;
}

int main(int argc, char *argv[])
{
  int num1, num2;
  argv[1] = num1;
  argv[2] = num2;

  printf("%d %d\n", num1, num2);

  swap(&num1, &num2);

  printf("%d %d\n", num1, num2);
  return 0;
}

【问题讨论】:

  • 这段代码 sn -p int num1, num2; argv[1] = 数字1; argv[2] = 数字2;没有意义。
  • swap 函数正在交换指针的对象,而不是指针。即使它确实交换了指针,它们也不会在调用方改变(函数参数是副本)。至于尝试将传递的argv 数组设置为整数:不要。您已获得指向字符串的指针数组。在任何情况下,num1num2 都没有被初始化。
  • @VladfromMoscow 这可能没有意义,因为它不正确。我希望能够将这些变量设置为用户在命令行中输入的任何内容。

标签: c function pointers command-line


【解决方案1】:

你的交换函数是正确的,你从命令行获取参数的方式不是,你想要的:

if (argc == 3) // Never trust the user
{
    num1 = (int)strtol(argv[1], NULL, 10);
    num2 = (int)strtol(argv[2], NULL, 10);
}
else
{
    fprintf(stderr, "Usage: %s num1 num2\n", argv[0]);
    exit(EXIT_FAILURE)
}

【讨论】:

    【解决方案2】:

    是的,交换取消引用 ptr1 和 ptr2 以更改地址内的值,因此要获取 num1 和 num2,您应该将 argv[1] 和 argv[2] 从字符串转换为整数,函数 atoi 将在此处执行

    num1 = atoi(argv[1]);
    num2 = atoi(argv[2]);
    

    【讨论】:

    • 你应该包含库#include
    • 你确实给了它论据?
    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2011-07-08
    • 2014-10-09
    • 1970-01-01
    • 2013-04-01
    • 2013-09-08
    • 2014-04-23
    • 2011-04-23
    相关资源
    最近更新 更多