【问题标题】:C - Why does getopt return 255 on linux?C - 为什么 getopt 在 linux 上返回 255?
【发布时间】:2013-06-08 21:18:14
【问题描述】:

我最近一直在玩getopt(来自 unistd.h)。我编写了一些在 Windows 7 下使用 MinGW 的 gcc 编译的代码,但在我的 Raspberry Pi 上的 Raspbian Linux 下无法正常工作(我使用 gcc 编译它们,没有选项;gcc t.c)。出于某种原因,当没有开关时,getopt 返回 int 255 或 char ÿ,而实际上它应该返回 -1。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  char t;
  opterr = 0;

  while ((t = getopt(argc, argv, "a:")) != -1)
    switch (t) {
      case 'a':
        printf("-a with argument %s\n", optarg);
        return 0;
      case '?':
        printf("uknown option\n");
        return 1;
      default:
        /* This is always 255 under linux, and is never reached under windows */
        printf("getopt returned int %d (char %c)\n", t, t);
        return 2;
    }

  return 0;
}

我遇到的一个问题是,实际上 255 -1 在 unsinged 8 位算术中,所以我尝试在 while 条件中放置一个 int 类型转换,但没有任何效果。

【问题讨论】:

  • Getopt() 返回一个 int。将char t; 更改为int t;,你会没事的。 (-1 表示 EOF,或者在这种情况下:没有更多选项。您可以通过添加 case -1: break; 来处理它)
  • 根据我的手册页,getopt 自 POSIX.2 以来没有返回 EOF。找不到更多选项时返回 -1。
  • @CarlNorum 我不明白你的意思,需要详细说明吗?
  • wildplasser 提到了EOF,我只是想澄清stdio.h 中的实际EOF 常量不是由getopt 返回的,并且自1992 年左右以来就没有返回。跨度>
  • 好吧,我认为他将 EOF 称为“文件结束”,或者更确切地说是输入结束,而不是那个。

标签: c getopt


【解决方案1】:

看起来您的系统/工具链默认为无符号 char 类型。这意味着当getopt() 返回-1 时,它会转换为255 并存储在t 中。然后将 255 提升为 int 类型(保持 255)并与无法匹配的 -1 进行比较。

getopt() 返回int,所以你应该将t 声明为int 以匹配,但如果你设置使用char,你将需要使用signed char

除此之外:既然您说您正在使用 gcc 进行编译,那么如果您希望对程序中的这个和其他 char 变量进行签名,您可能还会发现 -fsigned-char 标志很有帮助。

其次:您可以通过传递 -funsigned-char 标志或在 Windows 测试中将 t 更改为 unsigned char 来复制失败,如果这样更容易调试的话。

【讨论】:

  • 作为一个小提示,C 程序不需要main() 有一个返回语句。
  • 公平一点。它有 3 个返回语句。当它退出 while 循环时,它只是没有一个。
  • 非常感谢!我忘记了 return 语句,但这不是我使用的实际代码,不过我会编辑它。
猜你喜欢
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多