ポインタ 2 文字列のポインタの扱い

コンピュータプログラミング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日