【问题标题】:Reverse order in array of char in CC中char数组的倒序
【发布时间】:2020-10-03 15:01:35
【问题描述】:

这些指针让我很困惑。我有一个函数作为参数 argc(字符串的参数数量 + 1 是代码的名称)和 char* argv[],如果我理解得很好,它是一个指针数组。现在作为结果,我需要在每一行上打印参数(字符串)和反转的字符串。这意味着如果我将 hello world 作为参数传递,我需要:

hello olleh
world dlrow

我尝试实现部分代码:

int main(int argc, char *argv[])
{
    int i = 1;
    int j;

    while (i < argc)
    {
        while (argv[i][j] != 0) {
            printf("%c", argv[i][j]);
            j++;
        }
        
        i++;
    }
    return 0;
}
}

现在我真的迷路了。内循环不起作用。我知道 argv[i] 传递了我所有的参数字符串,但显然我需要输入字符串(字符数组)来交换指针。我也不明白为什么 argv[0] 和 *argv 之间的区别,因为理论上 argv[0] 打印数组的第一个元素,它是一个指针,所以是一个地址,但它不是打印第一个参数.

【问题讨论】:

  • 问问自己,j 在内部 while 循环的开头应该有什么值。

标签: arrays c pointers reverse


【解决方案1】:

char* argv[] 是一个“指向字符的指针数组”学习如何在 C 中读取类型很重要;因为,这些类型会启用/阻碍你做事的能力。

类型从右到左读取。 [] 是一种数组类型,具有未指定数量的元素 * 是指针类型,char 是基本类型。结合这些,你现在有了“一个字符的指针数组”

所以要从argv 中得到一些东西,您首先要指定它在数组中的哪个元素。 argv[0] 将指定第一个元素。让我们看看返回了什么。由于数组不是结果的一部分,所以答案是“指向字符的指针”

 char* line = argv[0];

将捕获指向字符的指针,该指针存储在 argv[0] 中。

在 C 中,char* 或“指向字符的指针”是用于字符串的约定。 C 没有“字符串”的新类型;相反,它使用指向字符的指针,其中推进指针最终会遇到\0 字符,该字符表示字符串的结束。

int main(int argc, char* argv[]) {
   int index = 0;
   while (index <= argc) {
      char* line = argv[index];
      printf("%d, %s\n", index, line);
      index++;
   }
 }

应该转储传递给您的程序的参数。从那里,我想你可以处理剩下的。

请注意,我从未将指针转换为数组。如果您从不指定数组的索引,则数组可以用作指针,但通常指针不能用作数组,除非您依赖不在类型系统中的信息(就像您清楚地从数组中抓取指针其他地方)。

祝你好运!

---- 更新以解决“我如何扭转它们?”的问题。 ----

现在你有了一个简单的char*(指向一个字符的指针)如何反转一个字符串?

请记住,字符串是指向字符的指针,其中下一个字符最终以\0 字符结尾。首先我们需要找到字符串的结尾。

char* some_string = ...
char* position = some_string;
while (*position != 0) {
  position++;
}
// end_of_string set, now to walk backwards
while (position != some_string) {
  position--; 
  printf("%c", *end_of_string);
}

【讨论】:

  • 那么我怎样才能进入参数内部来遍历字符呢?
  • @ElenaFranchini 遍历字符一次。如果不这样做,您将永远不知道角色在哪里结束。然后从结尾开始,将字符带回到开头,或者以相反的顺序存储它们;或者如果不需要存储,将它们打印到屏幕上。我将更新帖子以提供一些建议。
  • 谢谢你,很抱歉回答迟了,有点清楚,但有些东西令人困惑。假设我有一个字符串 p1="hello",另一方面,我有一个包含“hello”“world”的字符串数组 argv。现在如果我打印 p1,我有字符串“hello”,所以我虽然打印 argv,我应该有 hello 和 world 的地址,但我只有 hello 的地址,为什么?我的意思是,打印指针必须返回它包含的内容,那么为什么 P1 包含所有数组而 argv 只包含第一个元素的地址,即使它们都指向数组?
  • @ElenaFranchini 字符串数组中的下一个地址将包含“world”。把你脑海中的数组部分和字符串部分分开。数组仍然只是一个数组;但是,它是一个指针数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多