使用指针替换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中字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章