c++;带指针的字符串操作,中间为null 我必须编写一个C++函数,具有以下规格:

c++;带指针的字符串操作,中间为null 我必须编写一个C++函数,具有以下规格:,c++,string,pointers,C++,String,Pointers,独特的 删除两个参数指针之间的重复特许。绳子保持在原来的位置 param first-指向字符串开头的指针 param last-指向上一次特许后的数据的指针 返回-指向新数据系列的第一个字符的指针 如果输入为“H\0ELLO C++!#”,则输出为“H\0ELLO C++!#”。 我不知道如何忽略中间的终止空值。这是 到目前为止,我的最佳方法是: char *sajat::unique(char *first, char *last){ char* moving = first + 1; ch

独特的

删除两个参数指针之间的重复特许。绳子保持在原来的位置

param first-指向字符串开头的指针

param last-指向上一次特许后的数据的指针

返回-指向新数据系列的第一个字符的指针

如果输入为“H\0ELLO C++!#”,则输出为“H\0ELLO C++!#”。 我不知道如何忽略中间的终止空值。这是 到目前为止,我的最佳方法是:

char *sajat::unique(char *first, char *last){
char* moving = first + 1;
char* follower = first;

while (moving != last)
{
char *sentinel = first; 
    if (*follower == *moving)
    {
    counter++;
    sentinel = follower; //here was the duplication
        while (follower != last)
        {
            *follower = *moving;
            follower++;
            moving++;
        }
        sentinel = follwer;
        moving = follower + 1;
    }
    moving++;         
    follower++;
   }
return first - counter;
}
所以这段代码显然是错误的…但它可以成功地识别重复。
(我知道这是我的家庭作业,我感到羞耻……但我已经试了几个小时来解决这个问题。很抱歉把代码弄乱了。)

这里给你的字符数组不是C字符串,因为它可以包含空字符。这意味着在处理C字符串时,您应该忘记所有关于C字符串的知识

它由两个指针给出,一个在起点,一个在终点。由于要就地处理,起始指针不会改变,因此函数应该只返回新的结束指针(定义仍然相同:超过最后保留的字符一个)

一旦这样说了,您就会发现当前的代码太复杂了。一次只需读取一个字符的字符串,将当前字符与前一个字符进行比较,并仅在它们不同时保留该字符串。一种简单的方法是使用两个指针,一个用于读取,一个用于写入,在每次迭代中递增读取指针,并且仅在必须保留字符时递增写入指针。对于前一个值,惯用的方法是将其初始化为不能用字符表示的int值

该功能简化为:

char *sajat::unique(char *first, char *last){
    char *rd = first, *wr = first;
    int prev = UCHAR_MAX + 1;       // cannot be a character value

    while (rd != last) {
        if (prev != *rd) {
            prev = *wr++ = *rd;
        }
        rd++;
    }

return wr;
}
演示代码:

#include <iostream>
#include <string>
#include <climits>

char *unique(char *first, char *last){
    char *rd = first, *wr = first;
    int prev = UCHAR_MAX + 1;       // cannot be a character value

    while (rd != last) {
        if (prev != *rd) {
            prev = *wr++ = *rd;
        }
        rd++;
    }

return wr;
}

int main() {
    char tst[] = "H\0elllo C+++++ +!#";
    char *last = unique(tst, tst+sizeof(tst) - 1);  // reject the terminating null

    std::cout << std::string(tst, last) << std::endl;  // first display the result as a string

    for (char *ix=tst;ix<last; ix++) {              // then every character in hexa
        std::cout << std::hex << " " << (unsigned int)(unsigned char) *ix;
    }
    std::cout << std::endl;
    return 0;
}

你能用std::remove\u if吗?我不明白这个问题。什么是复制品?上面的输出字符串有两个
'+'
和两个
'
,它们不是重复的吗?为什么要忽略
'\0'
字符?您的问题描述中没有任何内容表示您必须忽略它。在这种情况下,忽略它意味着什么?您应该返回的“新数据系列”是什么?这里重复:两个字符后面都是相同的。我想保留\0个字符,你说得对。忽略的意思是不使用第一个字符作为终止字符。新的数据系列是没有重复的字符串。对不起,我不清楚。@Tom如果,我会尝试删除,谢谢。非常感谢您的解决方案和详细解释!