好的,所以我试图在C ++中反转一个C风格的字符串,我正在尝试一些奇怪的输出。也许有人可以解释一下?
这是我的代码:
int main(){
char str[] = "string";
int strSize = sizeof(str)/sizeof(char);
char str2[strSize];
int n = strSize-1;
int i =0;
while (&str+n >= &str){
str2[i] = *(str+n);
n--;
i++;
}
int str2size = sizeof(str)/sizeof(char);
int x;
for(x=0;x<str2size;x++){
cout << str2[x];
}
}
这里的基本思想是将指针指向字符串的结尾,然后使用指针算法将其向后读入新数组。
在这种特殊情况下,我得到一个输出:“gnirts” 任何输出的开头都有一个烦人的空间,我假设它是空字符?但是当我试图通过递减strSize变量来排除它时,我最终在字符串另一端的一些其他字符可能来自另一个内存块。
有关如何避免这种情况的任何想法? PS :(你们会认为这是一个反转字符串的好主意吗?)
答案 0 :(得分:7)
有效字符串应以空字符结尾。因此,您需要将空字符保留在其原始位置(在字符串的末尾),并仅反转非空字符。所以你会有这样的事情:
str2[strSize - 1] = str[strSize - 1]; // Copy the null at the end of the string
int n = strSize - 2; // Start from the penultimate character
答案 1 :(得分:1)
我会让C ++标准库做更多的工作......
#include <cstddef>
#include <algorithm>
#include <iterator>
#include <iostream>
int main()
{
typedef std::reverse_iterator<char const*> riter_t;
char const str[] = "string";
std::size_t const strSize = sizeof(str);
char str2[strSize] = { };
std::copy(riter_t(str + strSize - 1), riter_t(str), str2);
std::cout << str2 << '\n';
}
答案 2 :(得分:1)
标准库中有一个算法可以反转序列。为什么重新发明轮子?
#include <algorithm>
#include <cstring>
#include <iostream>
int main()
{
char str[] = "string";
std::reverse(str, str + strlen(str)); // use the Standard Library
std::cout << str << '\n';
}
答案 3 :(得分:1)
@ildjarn和@Blastfurnace已经提出了很好的想法,但我想我会更进一步,并使用迭代器来构建反向字符串:
std::string input("string");
std::string reversed(input.rbegin(), input.rend());
std::cout << reversed;
答案 4 :(得分:0)
while (&str+n >= &str){
这是胡说八道,你只想
while (n >= 0) {
和
str2[i] = *(str+n);
应该更具可读性
str2[i] = str[n];
答案 5 :(得分:0)
您的while循环条件(&str+n >= &str)
相当于(n >= 0)
。
您的*(str+n)
相当于str[n]
,我更喜欢后者。
正如HappyPixel所说,你应该在n
开始strSize-2
,所以复制的第一个字符将是str的最后一个实际字符,而不是str的空终止字符。
然后,在复制循环中的所有常规字符后,需要使用str2
在str2[strSize-1] = 0;
的末尾添加空终止字符。
这是修复的工作代码,输出“gnirts”:
#include <iostream>
using namespace std;
int main(int argc, char **argv){
char str[] = "string";
int strSize = sizeof(str)/sizeof(char);
char str2[strSize];
int n = strSize-2; // Start at last non-null character
int i = 0;
while (n >= 0){
str2[i] = str[n];
n--;
i++;
}
str2[strSize-1] = 0; // Add the null terminator.
int str2size = sizeof(str)/sizeof(char);
int x;
cout << str2;
}