c++;带指针的字符串操作,中间为null 我必须编写一个C++函数,具有以下规格:
独特的 删除两个参数指针之间的重复特许。绳子保持在原来的位置 param first-指向字符串开头的指针 param last-指向上一次特许后的数据的指针 返回-指向新数据系列的第一个字符的指针 如果输入为“H\0ELLO C++!#”,则输出为“H\0ELLO 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
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如果,我会尝试删除,谢谢。非常感谢您的解决方案和详细解释!