ポインタについて理解を深めるために演習問題をやるよ
問題3
ポインタを使って、文字列を走査し、@以降をどうにかして削除しなさい。
char str1[] = "youetsu@jc-21.jp"; int lenghth = 0;//文字列の長さ char *p = nullptr;
解答
解法を考えると2つぐらいやり方がありそうな気がします。
- 文字列として考えると'@'を'\0'に置き換えると文字列はそこでストップと扱われる説
- “youetsu@jc-21.jp” ⇒ “youetsu'\0'jc-21.jp” とするとcout は '\0' までしか表示しない説
- 文字列を走査し、'@'が現れてから'\0'までを全部'\0'(空文字、ナル文字)にしちゃう説
解答 説1
int main() { char str[] = "youetsu@jc-21.jp"; int length = 0;//文字列の長さ char *p = str; while(*p != '\0') { if(*p == '@'){ *p = '\0'; break; } p++; } std::cout << str << std::endl; }
結果を表示してみる
youetsu
解答 説2
ここで使っているアドレスをたどったループはそのうちstl(スタンダードテンプレートライブラリ)などで頻出なので、よく理解しておいたほうが、今後のゲームプログラマ人生を楽しく過ごすことができます。
#include <iostream> #include <string> int main() { char str[] = "youetsu@jc-21.jp"; char *at_index; char *p = str; while(*p != '\0') { if(*p == '@'){ //@マークが入っているアドレスを記憶しておく at_index = p; } p++; } //ループを抜けたとき*pは'\0'、pは'\0'の入っている変数のアドレスを指す。 //アドレスを1っ個ずつ増やしてループすることもできるよ //これが自然と出来ると上級者っぽい for(char *i = str; i<p; i++) { std::cout << *i; } std::cout << std::endl; //このループの仕方を使うと、さっき保存した@の入ってるアドレスから //'\0'のアドレスまでをループさせることができるので //その間を'\0'で埋めてやろう! for(char *i = at_index; i<p; i++) { *i = '\0'; } std::cout << str << std::endl; }
一応実行結果を示します。
youetsu@jc-21.jp
youetsu
youetsu
ちゃんと、'@'以降が削られているのがわかると思います。
ポインタの使い方や、ループの方法など、重要なことが詰まった練習問題なのでよく理解するようにしてください。