私は非常に新しいcppで、 '*'の2番目のオカレンスを '!'次のメソッドを使用して、指定された文字列内のcharポインタを使用している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
line.Ifに実行時エラーを取得しています。 '*'
を'!'
と置き換えることは可能ですか?cmark[i] = '!'
?
おそらく、役立つかもしれないリテラル読み取り専用の文字列を変更しようとしていません。 'char val [] = ...'。そして、この関数に 'val'をアドレスで渡すことにはほとんど意味がありません.btwは、' val'が現在のポインタではなく配列型である場合に修正する必要がある問題です。 – WhozCraig
valがポインタ型であれば、それは読み取り専用です。また、アドレスを渡すことでcharを置き換えることはできませんか? – user3512178
タイプは問題ではありません。それは車輪がワゴンから落ちるそのデータに何をしようとしているのかを指しています。あなたのコードは、読み取り専用リテラルを指すポインタを宣言します。マークした行は、そのメモリに書き込もうとするので、あなたのプログラム(幸いにも)がクラッシュします。 – WhozCraig