【问题标题】:C programming find length of 2 Dimensional arrayC编程查找二维数组的长度
【发布时间】:2011-06-19 00:36:43
【问题描述】:

我的程序使用 argc 和 argv[] 获取命令行参数。我的问题是如何找到 argv[1][i] 的长度。

我的代码获取 argv[] 的长度

int my_strlen(char input[]){ 
    int len = 0;
    while(input[len] != '\0'){
       ++len;
    }
    return len;
}

但是当我尝试查找 argv[1][len] 时,我得到的下标值既不是数组也不是指针: 我的尝试

int my_strlen(char input[]){
   int len = 0;
   while((input[1][len] - '0') != '\0'){
      ++len;
   }
   return len;
}

完整代码:

#include <stdio.h>
#include <math.h>

int my_strlen(char input[]);

int main(int argc, char *argv[]){
int length = 0;
length = my_strlen(argv[1]);
long numberArr[length];
int i, j;

for(i = 0; i < length; i++){
  numberArr[i] = argv[1][i] - '0';
}

 return 0;
}

int my_strlen(char input[]){
 int len = 0;
 while((input[1][len] - '0') != '\0'){
  ++len;
 }
 return len;
}

提前感谢您的帮助!

【问题讨论】:

  • argv 是一个二维字符数组 (char),这意味着它是一个一维字符串数组。
  • @Gabe:谢谢,我正处于学习 C 的早期阶段,所以由于 C 中没有字符串类型,当人们将它们称为“字符串”时我有点困惑。不过谢谢你的帮助!

标签: c arrays multidimensional-array type-conversion


【解决方案1】:

我认为您对 argv 内容感到困惑。操作系统将传递许多 ASCIIZ 字符串,这样调用带有参数 ala 的 my_program...

my_program first second third

...类似于在您的程序中有以下声明...

int argc = 4;
const char* argv[4] = { "my_program", "first", "second", "third" };

因此,当您索引argv[1][i] 时,您将获得字符串“first”中的第 i 个字符。这仅对介于 0(产生“f”)和 5(索引到终止 NUL 字符“\0”)之间的 i 值有效。

所以,没有二维 N*M 数组,但有一个指向 (array-of-char) 的指针数组。您可以像在strlen(argv[1]) 中一样调用普通的strlen() 函数来找出每个参数中的字符数。只有argc 告诉您argv 中的元素总数。

这有帮助吗?

【讨论】:

  • 好的,我想我明白了,所以我应该将 argv[1] 视为字符串并使用 strlen(argv[1]) 来获取字符串长度?我以前使用过这个,有时会出现分段错误错误
  • @Grant:是的,这是正确的方法。您在尝试使用 argv[1] 之前检查过 argc 吗?如果您忘记提供命令行参数,则不能使用 strlen(argv[1])。在可能未设置某些环境变量等的 shell 中,这很容易做到。请记住,程序名称是 argv[0] 并且占 1argc,因此最后一个参数仍然只有 argv[argc - 1]。换句话说,检查argc &gt; 1 以确保您有argv[1]。如果您确实发现问题仍然存在,请发布损坏的代码。
  • 澄清一下,二维字符数组和字符串数组(字符指针)是有区别的。想象一下(使地址增加)argv[0] = 0x123456 的情况。 argv[1] 可能是 0x055555。 argv 与字符矩阵不同...
  • @Tony:是的,我让它检查 argc(我做的第一件事)。我不确定到底输入了什么使它返回分段错误,因为我正在使用教授用来对其进行评分的单独程序(我将不得不弄乱它)。快速提问,char* argv[4] 之前的 const 将其声明为字符串? (我知道 C 中没有字符串类型)。
  • @Grant:const 只是要求编译器在您不小心尝试修改指针指向的字符时生成错误。通常,这对 argv 来说是一个好主意,因为您很少想要修改它们但可能会意外更改它们,从而产生令人困惑的错误。在创建指向字符串文字的指针(例如“程序中的引用文本”)时,这是一个绝妙的主意,因为操作系统可能会将它们加载到只读内存中,并且如果您尝试写入它们会在运行时失败:更好在编译时知道问题。
【解决方案2】:

main 中,您将argv[1] 传递给my_strlen。这意味着my_strlen 只接收一个普通的一维字符串。不需要input[1][len],只需input[len]

【讨论】:

  • 我以前有过。但是,有时我会遇到分段错误,这就是为什么我尝试它有点不同
  • 即使固定,my_strlen()input[len] - '0' != '\0' 时循环:但“-'0'”实际上是说减去用于编码字符零/'0'的数值(在 ASCII , 48 十进制),并确保结果不是用于对字符 '\0' 进行编码的数值(始终为 0)。鉴于“x - y != 0”等价于“x != y”,您只是在说循环,直到找到零/'0' 字符。但是,您确实想检查 ASCII NUL/'\0' - 只需使用 while (input[len] != '\0') 或等效的 while (input[len]),它利用 C 将 0 解释为 false,将非 0 解释为 true。
  • @Grant:再看一遍,你还有一个问题。字符串的结尾由值为 '\0' 的字符表示,因此您的 while 循环应该更像 while (input[len] != '\0')
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2023-03-16
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多