指针固定线

时间:2018-10-23 14:21:26

标签: c++ string algorithm pointers

因此,我写了一个代码,输入一个单词,将其首个字母放在单词的末尾(例如,“ egg”将为“ gge”,如果再次执行相同的过程,它将为“ geg”,然后最后回到“ egg”) 我只想执行一次此过程。而且我想使用一个指针来记住单词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;
}

我做错了什么,我应该怎么做?

2 个答案:

答案 0 :(得分:6)

  

我做错了什么,我应该怎么做?

您似乎误解了指针是什么。 指针是指向其他变量的变量。在这种情况下

char s[100];
char *P = s;

P 指向 s的第一个字符元素。在许多情况下,s都使用相同的指针。

您仍然只有一个数组来存储100个字符。您只有该数组的两个标识符,因为可以通过sP到达它。

如果将数组从“ 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';
}

答案 1 :(得分:1)

这称为旋转字符串。

尚不清楚为什么您决定为此使用指针。指针不是字符串。指针不“包含”自己的信息*。指针指向一些信息。在这里,您正在创建一个指向原始字符串的指针,然后更改该字符串……但是您的指针仍然只是指向相同的,经过更改的字符串。指针不知道字符串采用什么形式,只知道所在位置

如果要存储原始字符串的副本,则必须按原样执行此操作,方法是将其元素复制到第二个char数组中,或者切换到std::string,因为它是2018年。

*好吧,显然是这样;它包含它指向的事物的地址,它本身就是“信息”。但这不是您想要的信息。

如果您真的要使用指针,则实际上可以使用它们获得预期的结果,但不能达到预期的效果(即,不存储字符串的副本) 。既然您知道已将字符串旋转了 n 次,并且知道了字符串的起始位置(即P!),而且知道字符串的长度(即n,尽管您当前没有设置该值,这是一个错误),您可以通过以不同顺序浏览其 current 形式的某些数学运算来输出字符串的原始形式。

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];
}

live demo

但是,首先,您也可以以这种方式“执行”(或假装执行)实际旋转。

或者在旋转字符串时将其打印出来。