我正在尝试使用指针向后重新排序C字符串。在我的程序中,我接受了字符串,然后在for
循环中重新排列它。
例如,如果我输入Thomas
,那么它应该使用指针返回samohT
。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
int lengthString;
char name[256];
cout << "Please enter text: ";
cin.getline(name, 256);
cout << "Your text unscrambled: " << name << endl;
lengthString = strlen(name);
cout << "length " << lengthString << endl;
char* head = name;
char* tail = name;
for (int i = 0; i < lengthString; i++)
{
//swap here?
}
for (int j = lengthString - 1; j > -1; j--)
{
//swap here?
}
return 0;
}
在这两个循环中我缺少什么?
答案 0 :(得分:4)
您似乎正在编写C和C ++的混合,但您的作业需要C字符串。我会这样写的。
char str[] = "Thomas";
size_t head = 0;
size_t tail = strlen(str)-1;
while (head<tail)
{
char tmp = str[head];
str[head] = str[tail];
str[tail] = tmp;
head++;
tail--;
}
您可以使用较少的变量编写此算法,但我个人认为此版本更易于阅读,理解和验证。
如果您更喜欢使用指针而不是索引,那么它看起来像这样:
char str[] = "Thomas";
char *head = str;
char *tail = str + strlen(str) - 1;
while (head<tail)
{
char tmp = *head;
*head = *tail;
*tail = tmp;
head++;
tail--;
}
这两个版本实际上难以区分。
答案 1 :(得分:4)
答案 2 :(得分:2)
for (int i = 0; i < (lengthString / 2); ++i)
{
char tempChar = name[i];
name[i] = name[lengthString - i - 1];
name[lengthString - i - 1] = tempChar;
}
编辑:
char* head = name;
char* tail = name + lengthString - 1;
while (head<tail)
{
char tempChar = *head;
*head = *tail;
*tail = tempChar;
++head;
--tail;
}
答案 3 :(得分:0)
如果你想在你的程序中使用for循环,你可以这样做,例如:
char reverse[256] = {0};
int reverseIndex = 0;
for (int i = lengthString - 1; i >= 0; i--)
{
reverse[reverseIndex++] = name[i];
}
答案 4 :(得分:-1)
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
int main() {
std::cout << "Please enter text: ";
std::string s;
std::getline(std::cin, s);
std::cout << "Your text unscrambled: " << s << '\n';
std::reverse(s.begin(), s.end());
std::cout << "Your text scrambled: " << s << '\n';
return 0;
}