【问题标题】:Array access args[0][1]-'0' [closed]数组访问 args[0][1]-'0' [关闭]
【发布时间】:2018-09-08 18:23:46
【问题描述】:

我已经搜索了很多关于此的参考,但我没有任何成功,所以我想我会在这里问。基本上,我试图理解一个用于在 linux 中创建 shell 的 C 编写程序,但我遇到了这段代码的问题

...
else if (args[0][0]-'!'==0){
      int x = args[0][1]-'0';
      int z = args[0][2]-'0';
...
}

args 存储用户输入的命令。例如,稍后子进程的地址空间(父进程读取命令,子进程执行它们)使用对execvp(args[0], args) 的调用来替换。 args的定义如下:char *args[MAX_LINE/2 +1];

我一直难以理解的是访问数组的方式;具体来说,这些表达在这种情况下的含义是什么: args[0][0]-'!'==0 args[0][1]-'0'; args[0][2]-'0';

【问题讨论】:

  • 它是一个数组数组,所以一个索引告诉你要抓取哪个数组,另一个索引告诉你要抓取该数组的哪个元素。
  • 首先,请记住char 只是一个小的int。而像'!' 这样的字符常量实际上是int 值。当char 用于算术运算时,它会提升为int。现在考虑所有这些,当args 中第一个字符串的第一个字符等于'!' 时,你认为减去'!' 会发生什么?结果会是什么?
  • 或更短,这只是if (args[0][0] == '!')的一种混淆方式
  • 代码正在检查第一个(假定的)字符串的前三个字符。但是if (args[0][0]-'!'==0) 是一种奇怪的写法if (args[0][0] == '!')
  • 至于xz 的初始化,我的第一条评论应该对您有所帮助。查看ASCII table 也可能有用。这是获取字符数字的整数值的一种不太混淆且非常常见的方法。

标签: c arrays linux


【解决方案1】:

从变量名来看,args 代表参数列表/数组。

arg[0] 是该数组的第一个元素。
args[0][0] 是该数组第一个元素的第一个字符。

表达式args[0][0]-'!'==0 检查该字符是否等于'!'。这本可以写成args[0][0] == '!' 更好。 就好像你决定使用if (i-10 == 0),而不是使用if ( i == 10 )

接下来的两行

  int x = args[0][1]-'0';
  int z = args[0][2]-'0';

期望第一个参数的第二个和第三个字符是数字并提取它们对应的十进制值。如果第一个参数是"!26",则x 的值为2z 的值为6

该逻辑取决于保证用于字符 '0' - '9' 的编码必须是连续的。

【讨论】:

  • 澄清一下,C 标准的第 5.2.1 节保证 '0''9' 的字符是连续的。它不依赖于特定的编码。
  • @Bendemann,不客气。很高兴我能提供帮助。
【解决方案2】:

可能args 是参考

int main(int argc, char **argv);

然后args[0] 是程序的名称,在下面的args 中你会找到程序的参数,参见例如Arguments to main in C

因此args[0[0]是程序名称的第一个字符。

【讨论】:

  • 不完全是我想要的,但感谢您抽出时间来回答。
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多