【问题标题】:C argv[2]++ vs (char*)argv[2]++?C argv[2]++ vs (char*)argv[2]++?
【发布时间】:2015-12-21 06:54:00
【问题描述】:

为什么 argvs 行为古怪? 示例:

这将按预期工作,打印第一个参数的第一个字符。

printf("%c", *argv[1]);

然而,这将打印 ascii 表中的字符(又名“更大”,表示为数字),而不是打印第一个参数的第二个字符:

printf("%c", *(argv[1] + 1);

稍作修改将无济于事,结果完全相同:

printf("%c", *(argv[1] + sizeof(char));

唯一有用的是将 argv[2] 转换为 char*:

printf("%c", *( (char*)(argv[1] +1 ) );

为什么会这样?我知道:

argv's type :=  char** argv
and argv[1] == *(argv + 1)
and argv[1]'s type should be char*

但显然不是,因为我需要强制转换它?这怎么可能?它被声明为 char**,但它的成员不是 char*s?

【问题讨论】:

  • 如果你想索引字符,为什么不argv[1][0]argv[1][1]等呢?
  • 您在第二个 sn-p 中缺少 )。也许如果你修复它,它会按预期工作。更新:第三个。第四。
  • 向我们展示真实的代码及其惊人的输出,
  • 您声称获得的输出将来自*argv[1]+1, not *(argv[1]+1)`。

标签: c char argv


【解决方案1】:

确保您的括号和取消引用确实在您认为的位置。如果argv[1] 包含test,那么

* ( argv[1] + 1 ) == 'e'
( * argv[1] + 1 ) == 'u'
^ ^
| |
+-+- slight difference here

【讨论】:

    【解决方案2】:

    你的问题的前提是错误的。这个程序:

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

    使用参数test 运行,打印e,而不是u

    【讨论】:

    • 我会听从你6年的经验,但我不认为指出问题是错误的通常是一个答案。
    • @Barmar 不是,但您不能在评论中进行代码格式化。我不在乎它是否会被删除,只要 OP 先读取它:-P
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2022-07-14
    • 2010-10-21
    • 1970-01-01
    • 2021-11-14
    • 2011-01-04
    相关资源
    最近更新 更多