如何使用交换函数和指针反转字符串数组? (C++)

Posted

技术标签:

【中文标题】如何使用交换函数和指针反转字符串数组? (C++)【英文标题】:How to reverse a string array in place using a swap function and pointers? (C++) 【发布时间】:2018-03-20 01:52:19 【问题描述】:

我的任务是反转一个字符串数组。我必须使用交换单个字符的交换函数,并且这个交换应该在一个循环中。将两个字符指针传递给交换函数以操作内存中的位置。所以这是我到目前为止所拥有的:

#include <iostream>
using namespace std;

void swap(char *a, char *b) //swap function that accepts two char     pointers
    char temp = *a;          
    *a = *b;                 
    *b = temp;



int main()

    char array[5] = 'H','e','l','l','o'; //string hello
    char *start = array[0]; //pointer for start of string
    char *end = array[array.length-1]; //pointer for end of string
    for (int i = 0, int j = array.length - 1; i < j; i++, j-- )
        swap(start,end);
        start++;
        end--;
    
    for(int i = 0; i < 5; i++) //print reversed array to user
        cout << array[i];
    


我对指针没有什么经验,所以我可能会错误地使用它们。任何帮助将不胜感激!

【问题讨论】:

除了明显的语法错误(array.length 不起作用),你测试过这段代码吗?快速浏览一下,您的算法看起来不错。 char *start = array[0]; 你不能用字符初始化指针,你应该这样做char *start = array; for (int i = 0, int j = array.length - 1; i &lt; j; i++, j-- ) 可以简化很多。比较startend 【参考方案1】:

在行

char *start = array[0];
char *end = array[array.length-1];

array[0] 是一个字符,而不是一个指针。您可以引用它来获取带有&amp;array[0] 的指针,或者利用数组的名称可以用作指向第一个元素的指针,例如char *start = array

什么时候做的

for (int i = 0, int j = array.length - 1; i < j; i++, j-- )

问题在于基本 C 数组中没有 array.length 这样的东西。即使有,它也被称为array.length()。您应该单独跟踪数组的长度或使用sizeof(array) / sizeof(array[0])请注意,这给您的是数组的大小(编译时间常数),而不是 C 风格字符串的长度。虽然比这两种方法更好的解决方案是只使用 std::string ,除了比 C 风格的字符串更容易使用之外,它还可以跟踪其长度。

此外,您不能在同一语句中声明两个变量,用逗号分隔,除非它们是相同的类型,在这种情况下,您可以省略第二个变量的类型,如下所示:int i = 0, j = length

另外,您应该了解如何使用引用将参数传递给您的交换函数,这样您就不必在使用该函数时一直引用它们。

【讨论】:

感谢您的回答。我进行了您建议的更改,并且指针线不再出现错误;但是,我仍然在这一行遇到错误: for (int i = 0, int j = 4; i 您不能在 for 循环的初始化语句中初始化两个变量(; 之前的第一个组件)。只需在此语句之外初始化变量,或者在其中初始化一个变量,然后在 for 循环之前的行中初始化另一个变量 @EatatJoes 据我所知你可以做到for(int i = 0, j = length - 1; ...) 我的错,你是对的。只是不使用另一种类型进行初始化; int i = 0, float j = 5. 啊,我不知道。谢谢大家,它终于编译了!【参考方案2】:

我认为你在正确的轨道上,但你的指针有点迷失了。

#include <iostream>

using namespace std;

void swap(char *a, char *b) 
    char temp = *a;
    *a = *b;
    *b = temp;


int main()

    const unsigned int array_size = 5u;
    char array[] =  'H','e','l','l','o' ;

    for (int i = 0, j = array_size - 1; i < j; i++, j--) 
        swap(&array[i], &array[j]);
    

    for (int i = 0; i < array_size; i++)  
        cout << array[i];
    

    return 0;

【讨论】:

以上是关于如何使用交换函数和指针反转字符串数组? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode344 反转字符串

如何反转字符串数组并使用指针反转每个字符串?

第八章 指针实验

第八章 指针实验

第八章指针实验

第八次实验报告