为什么这个C ++程序不能将单词倒转

问题描述

我对C ++极为陌生,并编写了此程序来反转单词。我尝试的是基本上遍历一个数组,并将第一个字母与最后一个字母交换,将第二个字母与第二个倒数交换,等等。但是结果是一些有线字符╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Ω ⌠7p≈╗。我不需要解决方法,因为在线上有很多示例。我只想知道为什么我的工作行不通。

#include <iostream>
using namespace std;

int main()
{
    char word[10];
    for (int i = 0; i < 10; i++)
    {
        word[i] = word[sizeof(word - i)];
    }

    cout << word << endl;

    return 0;
}

它也给了我这个警告warning C6001: using uninitialized memory 'word'。但是我虽然通过执行char word[10]来初始化内存。

解决方法

问题是sizeof(word - i)的实际作用。

简短的回答:它返回指针大小(4或8)。

更详细的答案:

  • word的类型为char[10],大小为10
  • 当您执行word + 1时,编译器将衰减指向char的指针的数组以执行此操作。因此结果类型为char *
  • 现在sizeof(char *)是4还是8,具体取决于您构建的平台(32或64位)
  • 因此word[sizeof(word - i)]始终引用相同的单元格

还有第二个问题。在C中,文本字符串必须以null结尾,以指示其大小。您的word包含apple,结尾没有零字符,因此在apple之后打印垃圾(它甚至可能导致程序崩溃)。

另外,您的代码更像C,在C ++中可以这样完成:

int main()
{
    std::string word{"apple"};
    std::string reversed{word.rbegin(),word.rend()};
    std::cout << word << '\n';
    std::cout << reversed<< '\n';

    return 0;
}
,

至少有三个问题。

第一个是数组未初始化,并且具有不确定的值。

char word[10];

第二个是这个循环

for (int i = 0; i < 10; i++)

在任何情况下都不会反转数组。

即使像更新数组一样

char word[5] = {'a','p','l','e'};

尽管如此,循环还是没有道理的。

for (int i = 0; i < 10; i++) 

这个表情

sizeof(word - i)

不正确。由于指针算术,该表达式word - i的类型为char *。至少你是说

sizeof(word ) - i

相反,您可以编写如下内容

#include <iostream>
#include <utility>
#include <cstring>

//...

char word[] = "Hello World!";

for ( size_t i = 0,n = std::strlen( word ); i < n / 2; i++ )
{
    std::swap( word[i],word[n - i - 1] );
}

std::cout << word << std::endl;

或者您可以编写一个单独的函数。你来了。

#include <iostream>
#include <utility>
#include <cstring>

char * reverse( char *s )
{
    for ( size_t i = 0,n = std::strlen( s ); i < n / 2; i++ )
    {
        std::swap( s[i],s[n - i - 1] );
    }

    return s;
}

int main() 
{
    char word[] = "Hello World!";
    
    std::cout << word << '\n';
    std::cout << reverse( word ) << '\n';
}   

程序输出为

Hello World!
!dlroW olleH
,

在您的情况下,word声明,但未初始化。该警告表示单词数组可能包含未初始化的值。

   char word[10];

要查看有意义的字符而不是垃圾值(未初始化),请向word输入值或在代码中对其进行初始化。

为什么这种行为?直到程序将特定值放入堆栈中定义的变量中为止,堆栈中才会包含垃圾。

,

sizeof(word - 1)将为4或8。因为它是一个指针。 您需要的是strlen(word)

此外,word尚未初始化,请执行类似char word[10] = "blabla"的操作。

注意,对于您所做的编辑,其中:

    char word[5] = {'a','e'};

strlen不起作用,因为您需要一个字符为null或0来知道字符串的结尾。

此外,似乎您正在用C ++编写代码,对于这样的事情,std::string就不需要char数组。然后您可以调用word.length()作为长度,它可以动态设置字符串所需的大小并增大。

,

C / C ++没有对声明的变量进行自动初始化。在引用之前,必须为每个数组填充一个值,因为C / C ++使用的是指针。