C中char数组中的逆序

问题描述

指针使我非常困惑。我有一个函数将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]打印数组的第一个元素是指针,因此是地址,但是它代替打印了第一个参数

解决方法

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);
}