私の質問は簡単です:
あなたがこれを持っているとしましょう:
char *chrptr = "junk";
*chrptr
当時を想像してみてくださいj
。現在の文字を次の文字にインクリメントする方法はありますか?j
この場合はそうなりk
ますか?次の文字に移動したくないので、現在のポイントの文字をインクリメントしたい。
私はCを初めて使用しますが、試したこと(*chrptr)++
は機能しません。
編集に基づいて、文字列を変更したいようです。定数文字列ではできませんが、実際にはできますが、その動作は未定義です。したがって、定義を非定数文字配列に変更する必要があります。
//This initializes a 5 element array including the null byte at the end
char chrptr[] = "junk";
//now you can modify that
chrptr[0]++;
//or equivalently
chrptr[0] +=1;
chrptr[0] = chrptr[0]+1;
char *chrptr = "junk";
このコードは本当に良くありません。「ジャンク」のような文字列リテラルは、読み取り専用メモリへのポインタです。それらを変更することは想定されていません。だからどちらか言う:
const char* chrptr = "junk"; // pointer to a const; no modifications
または(あなたの場合):
char chrArray[] = "junk";
これにより、スタック上に5要素の文字配列が作成され、「ジャンク」(およびヌルターミネータ)で初期化されます。これで、自由に変更できます。
chrArray[0] ++;
(*chrArray) ++;
(残りの発言)
私はcを初めて使用しますが、(* chrptr)++などは機能しません。
それらは機能しますが、異なります。これを要約しましょう:
chrptr
タイプpointer-to-charの値です。*chrptr
ポインタが逆参照されているため、はchar型の値です。これらは両方とも「l値」(=実際のオブジェクト)であるため、次のように変更できます。
++ chrptr
ポインタを1つインクリメントします(=ポインタを1オブジェクト進めます)++ *chrptr
文字を1つ増やします(=に変わります'a'
)'b'
。(以前は++*chrptr
、文字列がメモリの読み取り専用セクションにあったため、機能しませんでした。notを使用して文字列を指定した場合const char*
、char*
予期しない実行時の動作ではなく、有用なコンパイルエラーが発生します。)
また注意してください:
単純なステートメントの場合、はと++*chrptr;
同等(*chrptr)++;
です。演算子の順序は重要です(逆参照してからインクリメントします)。
OTOHは、演算子の優先順位*chrptr++
のため、インクリメントしてから逆参照します。優先順位がわからない場合は、括弧を追加してください。
逆参照演算子を使用してポインターを再度逆参照する必要はありません*
。
chrptr++
メモリ内の文字ポインタを進めるだけです。
アップデート
while
文字を検索するためにループをラップすることができます。
char *chrptr = "junk";
char search = 'k';
while (*chrptr) {
if (*chrptr == search)
printf("%c\n", *chrptr);
chtptr++;
}
これを参照してください (*chrptr)++; 正常に動作しますが、これにより、chrptr が指す配列の最初の文字がインクリメントされます。あなたの場合、次のようなステートメントを使用しています
char *chrptr = "がらくた";
ここで、chrptr は const char 配列を指しているため、(*chrptr)++ を使用しています。文字列の変更を反映せずに増加します。
しかし、このようにコードを使用すると (http://codepad.org/FJMB1ryv) :--
#include<iostream>
using namespace std;
int main()
{
char a[]="yogendra";
char *y=a;//(char*)"junk";
(*y)++;
cout<<y<<endl;
return 0;
}
あなた (*y)++ は動作します。これが役に立てば幸いです。幸運を:)