使用指针替换cpp中字符串中的字符

Posted

技术标签:

【中文标题】使用指针替换cpp中字符串中的字符【英文标题】:Replacing character in string in cpp using pointer 【发布时间】:2016-07-07 07:06:20 【问题描述】:

我是 cpp 的新手,并试图用 '!' 替换第二次出现的 '*'使用以下方法在给定字符串中的字符。

#include <iostream>
#include <string.h>

using namespace std;

void replaceChar(char **inp)
    char *tmp = *inp;
    const char *c = "*";
    char *cmark = strstr(tmp,c);
    cout<< *cmark;
    if(cmark != NULL && strlen(cmark) > 1)
        cmark++;
        if(strstr(cmark,c))
            int len = strlen(cmark);
            cout<<"len"<<len;
            for(int i=0;i<len;i++)
                if(cmark[i] == '*')
                    cout<<"i.."<<i;

                    cmark[i] = '!';//error point
                
            
        
    




int main() 

    char * val = "this is string*replace next * with ! and print";
    replaceChar(&val);
    cout<<"val is "<< val;
    return 0;

我在 error point 行上遇到运行时错误。如果我注释掉这一行,我将得到要替换的 '*' 的正确索引。 是否可以使用cmark[i] = '!''*' 替换为'!'

【问题讨论】:

也许不尝试修改只读字符串文字可能会有所帮助。 char val[] = ...。而且我认为通过地址将val 传递给此函数没有什么意义,顺便说一句,如果val 是数组类型而不是当前的指针,则需要解决这个问题。 表示如果val是指针类型,那么它将是只读的。也不能通过地址替换char? 类型不是问题;这就是它指向的内容,以及您尝试对车轮从货车上掉下来的数据执行的操作。您的代码声明了一个指向只读文字的指针。您标记的行尝试写入该内存,因此您的程序(幸运的是)崩溃了。 终于找到了描述你崩溃根源的问题:See here 除了一些流助手来简化输出,这确实是一个 C 问题。 【参考方案1】:

查看difference between char s[] and char *s in C

#include <iostream>
#include <string.h>

using namespace std;

void replaceChar(char *inp)
    char *tmp = inp;
    const char *c = "*";
    char *cmark = strstr(tmp,c);
    cout<< *cmark;
    if(cmark != NULL && strlen(cmark) > 1)
        cmark++;
        if(strstr(cmark,c))
            int len = strlen(cmark);
            cout<<"len"<<len;
            for(int i=0;i<len;i++)
                if(cmark[i] == '*')
                    cout<<"i.."<<i;

                    cmark[i] = '!';
                
            
        
    




int main() 

    char val[] = "this is string*replace next * with ! and print";
    replaceChar(val);
    cout<<"val is "<< val;
    return 0;

【讨论】:

【参考方案2】:

不需要在方法中传递指向指针的指针。 相反,您可以将原始指针传递给字符串。 你可以用更简单的方法来做。

void replaceChar(char *inp)
    int i;
    int second = 0;
    /* Strings in C\C++ is null-terminated so we use it to determine 
    end of string */
    for (i = 0; inp[i] != '\0'; ++i) 
        if (inp[i] == '*') 
            /* Use flag to determine second occurrence of * */
            if (!second) 
                second = 1;
             else 
                inp[i] = '!';
                break;
            
        
    

【讨论】:

虽然正确,但这并不能解决问题的根源,也会崩溃。

以上是关于使用指针替换cpp中字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章

02char字符与字符串替换,双指针,从后往前

怎么用C语言对文件操作用特定内容替换其中某些内容

c_cpp 使用指针算法反转字符串

c语言:如何将字符串中指定的字符替换为另一个指定字符

替换空格

c_cpp 在C语言中,返回指向子字符串中字符串开头的指针。