コンピュータプログラミングB-4 ポインタ 2 文字列のポインタの扱い 文字列を初期値として変数や配列に 持たせる方法 (1) 変数に持たせる方法 (イ) char *name ; name=“Tokyo” ; (ロ) char *name =“Tokyo” ; (イ),(ロ)はいずれも下図のようになる。 T o k y o ¥0 name 変数nameは文字列のポインタをもつ 文字列を初期値として変数や配列に 持たせる方法 (2) 配列に持たせる方法 (ハ) char name [6] ; strcpy(name,”Tokyo”) ; (ニ) char name [ ]=“Tokyo” ; (ハ)、(ニ)はいずれも次図のようになる。つまり、配列に 文字列そのものを入れる。 name T o k y o ¥0 初期化とは、(ロ)と(二)の場合をいう。 文字列から文字を切り出す # 文字列から1文字ずつ切り出すには。ポインタを利用する。 #include<stdio.h> main( ) { char *name=“Tokyo” ; /* nameはポインタ変数*/ for(;;) { if(*name==‘¥0’ )break /* 文字列の末尾なら停止*/ printf(“%c¥n”,name) ; name++ /* name=name+1 ポインタを右へずらす*/ } } 文字列のアドレス • 数値データがメモリ上にある場合でも、この数値 データからはそのアドレスを求めることはできない が、変数に代入すれば、その変数のアドレスを求め ることはできる。 int *a=5; printf(“address=%p”,a); • 文字列データの場合には、 char *p; p=“Tokyo”; printf(“address=%p”,p); /*先頭文字のアドレス*/ printf(“address=%p”,p+1); /*次の文字のアドレス*/ 注意:ポインタ変数に代入されているデータの出力において、変換指定子として、%pを使え ば、16進数で、また、%dを使えば、10進数で、アドレスの値が出力される。 文字列の入力に関する説明 10章での文字列入力では: char a[10] ; scanf(“%s”,a) ; /* &aでないことに注意 */ printf(“入力文字列は %s”,a) ; 配列名aは、この配列のアドレスである。pp128 本章で紹介するやりかたでは: char a[10], *p ; p=a ; /* ポインタpにaの先頭アドレスを代入 */ scanf(“%s”,p) ; printf(“入力文字列は %s”, * p) ; 文字列の入出力の扱い #include<stdio.h> #include<string.h> main( ) { char a[20], *p ; int n,k ; printf(“20文字以内の文字列を入力しなさい¥n”) ; p=a ; for(;;) { scanf(“%c”,p) ; if(*p==0x0A) break /* 0x は、0Aが16進数であることを示す */ p++ ; } 0AはLF(Line Feed)のコードであるEnterの検出 前頁からの続き *p=‘¥0’ ; n=strlen(a) ; printf(“入力した文字列は ¥n”) ; p=a ; for(k=0;k<n;k++) /*文字列の中のn字分だけ・・*/ { printf(“%c”, *p) ; p++ ; } 確保された配列 a の領域 char a[20],*p ;が実行されたとき 確保される 00AA 00AB 00AC 00AC ・・・ a のポインタ p=aで、pはこのアドレスが入る pの値を変えたとき、それがaの領域内なら、*p=‘G’ とすると、aの中のその位置はGが入る 課題5 問題:各自の氏名をローマ字の文字列 で入力し、第2文字、第4文字、文字 列全体について、それぞれのアドレス と当該文字(または文字列)を表示す るプログラムを作成し、そのソースプ ログラム及び実行結果を提出せよ。 提出期限:11月15日
© Copyright 2024 Paperzz