【问题标题】:How to reverse a string array in place using a swap function and pointers? (C++)如何使用交换函数和指针反转字符串数组? (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

标签: c++ arrays string pointers


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多