2016-07-07 1 views
0

私は非常に新しい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] = '!'

+3

おそらく、役立つかもしれないリテラル読み取り専用の文字列を変更しようとしていません。 'char val [] = ...'。そして、この関数に 'val'をアドレスで渡すことにはほとんど意味がありません.btwは、' val'が現在のポインタではなく配列型である場合に修正する必要がある問題です。 – WhozCraig

+0

valがポインタ型であれば、それは読み取り専用です。また、アドレスを渡すことでcharを置き換えることはできませんか? – user3512178

+0

タイプは問題ではありません。それは車輪がワゴンから落ちるそのデータに何をしようとしているのかを指しています。あなたのコードは、読み取り専用リテラルを指すポインタを宣言します。マークした行は、そのメモリに書き込もうとするので、あなたのプログラム(幸いにも)がクラッシュします。 – WhozCraig

答えて

0

メソッドでポインタへのポインタを渡す必要はありません。 代わりに、元のポインタを文字列に渡すことができます。 これはもっと簡単な方法で実行できます。

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; 
      } 
     } 
    } 
} 
+0

正しいですが、これは問題の根本には触れず、クラッシュすることもあります。 – Donnie

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; 
} 
関連する問題