指针保留字符串
Pointer retaining string
所以我写了一个代码,输入一个单词,取它的第一个字母,把它放在单词的末尾(例如。"egg"将是"gge",如果我们再次执行相同的过程,它将是"geg",然后最终回到"egg"( 我只想做这个过程 1 次。我想用一个指针来记住单词的初始值,那就是 egg,然后字符串必须记住 "gge"。
这是代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[100],aux,*P;
int p=1,i,n,k,j;
cin.get(s,100);
i=0;
while(i>=0)
{
P=s; //this is the pointer that SHOULD memorize "egg"
aux=s[0];
for(j=1; j<=n; j++) s[j-1]=s[j];
s[n]=aux;//until here it does the letter thing
break;
}
cout<<P<<endl<<s;//now here the pointer P should be "egg" and the string s should be "gge"
//but the program prints out "gge" and "gge".
return 0;
}
我做错了什么,我应该如何做我想做的事?
我做错了什么,我应该如何做我想做的事?
您似乎误解了指针是什么。 指针是指向其他内容的变量。在这种情况下
char s[100];
char *P = s;
P
指向s
的第一个字符元素。这是s
在许多上下文中衰减到的同一指针。
您仍然只有一个数组来存储 100 个字符。该数组只有两个标识符,因为您可以通过s
或P
访问它。
如果你把这个数组从"egg"变异到"gge"或其他什么,P
仍然只是指向它最初所做的相同数组。除了位置(地址(之外,它没有保存任何内容的副本,这不是更改的内容。
如果我能走两条路到你的蓝房子,你把房子重新粉刷成绿色,其中一条路仍然通向原来的蓝房子。这不是道路的运作方式,也不是房屋的运作方式,也不是指针的运作方式。
您想要某个地方存储原始的 3 或 4 个字符,这意味着您想要另一个 char 数组,或者更好的std::string
.这将在更改您关心的角色之前复制它们。
最小的工作变化可能是
// P = s <-- just stores the location
P = strdup(s); // <- copies the contents
但请注意,您应该在完成后的某个时候free(P)
。切换到std::string
真的容易得多。
使用std::string
值语义进行复制的简单示例:
#include <string>
#include <algorithm>
#include <iostream>
// source is a copy of the string passed
std::string rotate_left(std::string source, size_t offset = 1)
{
std::rotate(source.begin(), source.begin()+offset, source.end());
return source;
}
int main()
{
std::string original{"eggsoup"};
// for interactive use: getline(std::cin, original);
std::string rotated = rotate_left(original);
std::cout << original << 'n' << rotated << 'n';
}
这称为旋转字符串。
目前尚不清楚您为什么决定为此使用指针。指针不是字符串。指针不"包含"自己的信息*。指针指向某条信息。在这里,你制作了一个指向原始字符串的指针,然后你改变了这个字符串......但你的指针仍然只是指向那个相同的、改变的字符串。指针不知道字符串过去采用什么形式,只知道它在哪里。
如果你想存储原始字符串的副本,你必须这样做,要么将其元素复制到第二个char
数组中,要么切换到std::string
,因为它是2018年。
*嗯,显然它确实如此;它包含它所指向的事物的地址,这本身就是"信息"。但这不是你想要的信息。
如果你真的想使用指针,你实际上可以使用它们获得预期的结果,但不能以你期望的方式(即不是通过存储字符串的副本(。由于您知道您已经旋转了字符串 n次,并且您知道它从哪里开始(这P
!(并且您知道它有多长(这是n
,尽管您目前没有设置它,这是一个错误(,你可以做一些数学运算来输出字符串的原始形式,只需以不同的顺序导航其当前形式。
const char* startOfString = &s[0];
const size_t lengthOfString = strlen(s);
const size_t numberOfRotations = 1;
// ... do your rotation here
// Now we can still print the original form, char by char, using MATHS!
for (size_t index = 0; index < lengthOfString; index++)
{
const size_t adjustedIndex = (index + lengthOfString - numberOfRotations) % lengthOfString;
std::cout << startOfString[adjustedIndex];
}
(现场演示(
但是,你也可以首先以这种方式"执行"(或假装执行(实际旋转。
或者只是在获得字符串后打印字符串,然后再旋转它。
- 指针保留字符串
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 从字符串流中读取具有特定字段宽度的 int
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- 如何创建一个函数来提取向量内部字符串中的字段?
- 协议缓冲区字符串字段的文本编码
- Qt 将字符串转换为以 16 为基数的 int,但保留以 16 为基数的值
- 通过 TCP 套接字发送大型 base64 字符串
- 无法通过 C++ 中的套接字发送字符串流变量
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 更改保留指向其字段的原始指针的对象地址
- 套接字缓冲区到字符串
- 删除数字并在C++中保留字符串的下划线
- 外部"C"不允许 C 标头使用C++保留字
- 解析标识符,但排除 BOOST 精神中的保留字
- 标准::字符串::保留和字符串结尾 0
- 字符串保留期间的 glibc malloc 死锁
- 在编译时定义字符串/char字面值
- 删除第一次循环时未调用析构函数的保留字
- qmake 语言保留字问题(我认为)