【问题标题】:Why does my program not check the number of arguments correctly?为什么我的程序不能正确检查参数的数量?
【发布时间】:2015-02-15 03:20:16
【问题描述】:

好的,所以我正在为必须从输入文件“input.txt”读取字符串的二叉搜索树编写代码,并且我正在尝试提供我的程序命令行参数。我的程序应该有两个命令行参数,程序的名称然后是文件的名称。如果 args 的数量不是两个,我会对其进行错误检查以停止程序。为什么我的程序在运行“./a.out main.c input.txt”时仍然会触发错误检查?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 15

typedef struct treeNode{
  char string[MAXLEN+1];
  struct treeNode *left;
  struct treeNode *right;
}treeNode;

treeNode * insert(treeNode *node, char s[MAXLEN]){
  if(node == NULL){
    treeNode *temp;
    temp = (treeNode *)malloc(sizeof(treeNode));
    strncpy(temp -> string, s, sizeof(treeNode));
    temp -> left = NULL;
    temp -> right = NULL;
    return temp;
  }

  else if(strcmp(node->string, s)>0){
    node -> right = insert(node->right, s);
  }
  else if(strcmp(node->string, s)<0){
    node -> left = insert(node->left, s);
  }
  else if(strcmp(node->string, s) == 0){
    node -> left = insert(node->left, s);
  }

}

  int main(int argc, char *argv[]){

  treeNode *root = NULL;

  FILE *ifp;
  FILE *ofp;
  char s[MAXLEN+1];

  if(argc != 3){
    fprintf(stderr, "Usage: %s file\n", argv[1]); exit(1);
  }

  if((ifp = fopen(argv[2], "r")) == NULL){
    fprintf(stderr, "Could not open file: %s\n", argv[2]); exit(1);
  }

  ofp = fopen("output.txt", "w+");

  fgets(s, MAXLEN, ifp);

  insert(root, s);

  fprintf(ofp, "%s\n", root->string);

  return 0;
}

【问题讨论】:

  • if(argc != 2) 更改为if(argc != 3)。程序名称(./a.out)也是一个参数。
  • 我已修改您的问题标题以描述实际问题。它写入 stderr 的事实不相关!
  • 我刚刚做了,但它仍然会触发错误检查。感谢您的意见
  • ifp = fopen(argv[1], "r")改成ifp = fopen(argv[2], "r"),因为程序名是第一个参数,input.txt第三个参数。
  • 总是需要检查 fopen() 和 fgets() 返回的值,而不仅仅是“有时”。函数“insert()”返回一个参数,但调用者没有检查/使用它。

标签: c command-line-arguments binary-search-tree stderr


【解决方案1】:

argc 将始终至少为 1,因为argv[0] 包含可执行文件的路径。 因此,您应该检查if ( argc != 3 ),因为您从命令行传递了 2 个参数。

当您执行./a.out main.c input.txt 时,argv[1] 将是main.cargv[2] 将是input.txt

在访问argv 数组中的所需元素时,您在许多地方都偏离了 1,因此请进行适当的更改。在您使用 argv[1] 的地方,您需要将其更改为 argv[2]

【讨论】:

  • 好吧,这是有道理的,我不认为 a.out 算作一个论点,但现在它是有道理的。虽然我将 args 的数量改为三个,但错误检查仍然被触发
  • 阅读我回答的最后一句话。
  • 我相信我做了你所说的改变,但我的错误检查仍然被绊倒。好像args的个数不是3?
  • @SamWylock 你没有重新编译。我只是复制、粘贴并运行了您的代码。它运行时不会打印任何错误。
  • 我正在使用 -c 标志重新编译。删除了标志并且它起作用了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多