问题描述
我对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 ++使用的是指针。