Comments
Description
Transcript
電気電子工学科 情報処理・演習2 第12回 文字列とポインタ
電気電子工学科 1 情報処理・演習2 第12回 文字列とポインタ 課題 自分の名前を表示するプログラムを作成せよ。 printf("文字列:"); #include <stdio.h> scanf("%s",s); int main(void) for(count=0;s[count];count++); /* 文字列入力 */ /* 文字数カウント */ { char name[40]; for(i=0;i<count;i++) char *ptr; { ptr=name; p[i]=s[(count-1)-i]; printf("お名前は:"); printf("%c",p[i]); scanf("%s",name); /* for 文で逆順出力 */ } printf("こんにちは、%s さん¥n",ptr); return(0); } 2 return(0); } 入力した文字列を、逆さに出力するプログラムを作成せよ。(ポイン タを用いない場合と用いた場合の2通り作る) 解答例 【ポインタ使用バージョン】 解答例 【配列バージョン】 int main(void) int main(void) { { int i,count; int i,count; char s[50],p[50]; char s[100],p[100]; printf("文字列:"); scanf("%s",s); /* 文字列入力 */ for(count=0;*(s+count);count++); /* 文字数カウント */ #include <string.h> int main(void) { for(i=0;i<count;i++) char s1[20]="Tarou Meiji"; /* for 文で逆順出力 */ char s2[20]; { strcpy(s2,"Meiji"); *(p+i)=*(s+(count-1)-i); printf("%c",*(p+i)); printf("フルネームは%s です¥n",s1); } printf("ファミリーネームは%s です¥n",s2); return(0); return 0; } } 実行結果 <実行結果> フルネームは Tarou Meiji です 文字列:December ファミリーネームは Meiji です rebmeceD 4 名前をローマ字入力して読み込み、toupper 関数(p.222)を利用して、 頭文字を大文字に変換、全ての文字を大文字に変換して出力させよ。 3 char 型配列 s1,s2 を用いて、s1 には姓名(フルネーム)を、s2 には 姓だけを表示させるプログラムを作成せよ。ただし、s2 に関しては strcpy() を用いること。 <プログラム例> <サンプルプログラム> #include<stdio.h> #include <stdio.h> #include<ctype.h> printf("大文字(全文字) : "); int main(void){ char name[2][20]; for(i=0;i<2;i++) int i,j; printf("%s ",name[i]); printf("¥n"); printf("氏名をローマ字入力せよ : "); for(i=0;i<2;i++) return(0); scanf("%s",name[i]); printf("変換前 } : "); for(i=0;i<2;i++) <実行結果> printf("%s ",name[i]); printf("¥n"); 氏名をローマ字入力せよ : meiji tarou 変換前 for(i=0;i<2;i++) name[i][0]=toupper(name[i][0]); : meiji tarou 大文字(頭文字) : Meiji Tarou 大文字(全文字) : MEIJI TAROU printf("大文字(頭文字) : "); 5 for(i=0;i<2;i++) つが連結されて出力されるようなプログラムをライブラリ関数 strcat( )を printf("%s ",name[i]); 各々最大 22 文字まで入力出来る三種類の文字列を入力するとその三 利用して作成せよ。 printf("¥n"); (解答例) for(i=0;i<2;i++){ for(j=0;j<20;j++) name[i][j]=toupper(name[i][j]); } #include<stdio.h> #include<string.h> #define NUMBER 22 2.名前(First Name)の部分のみを配列を使って出力させる。 3.配列を使って、名前(First Name)の部分の文字を変える。 int main(void){ 4.文字列を次の文字(A ならば B)に変えて出力させる。 【プログラム例】 int i; #include <stdio.h> char ab[NUMBER],cd[NUMBER],ef[NUMBER]; #include <string.h> printf("一つ目の文字を入力して下さい¥n"); int main (void) scanf("%s",&ab); { char name[10]; printf("二つ目の文字を入力して下さい¥n"); int n; scanf("%s",&cd); strcpy(name, "MEIJI TARO"); printf("三つ目の文字を入力して下さい¥n"); printf("自分の名前を配列を使って出力:¥n"); scanf("%s",&ef); printf("name = %s¥n", name); strcat(strcat(ab,cd),ef); printf("自分の名前の部分のみを配列を使って出力:¥n"); putchar(name[6]); printf("%s",ab); putchar(name[7]); putchar(name[8]); return(0); } putchar(name[9]); putchar('¥n'); 6-1.自分の氏名を文字配列とし、その文字配列を使って以下のような処 printf("配列を使って名前のデータを書き換える:¥n"); 理をしなさい。(名前の文字数はあらかじめ分かっているものとして良い) name[6] = 'J'; 1.自分の氏名を文字配列を使って出力させる。 name[7] = 'I'; putchar(name[6]); MEIJI TARO -> NFJKJ!KJSP putchar(name[7]); 6-2.自分の氏名を文字配列とし、ポインタを使って以下のような処理を putchar(name[8]); しなさい。(名前の文字数はあらかじめ分かっているものとして良い) putchar(name[9]); 1.分の氏名を文字配列とポインタを使って出力させる。 putchar('¥n'); 2.名前(First Name)の部分のみをポインタを使って出力させる。 3.ポインタを使って、名前(First Name)の部分の文字を変える。 4.文字列を次の文字(A ならば B)に変えて出力させる。 printf("配列を使って文字列を更新する:¥n"); n = 0; 【プログラム例】 while(name[n]){ #include <stdio.h> name[n] = name[n]+1; #include <string.h> ++n; } main () printf("MEIJI TARO -> %s¥n", name); { return (0); char name[10]; char *p; } strcpy(name, "MEIJI TARO"); 【実行結果】 p = name; 自分の名前を配列を使って出力: printf("自分の名前を配列とポインタを使って出力:¥n"); name = MEIJI TARO printf("name = %s: p = %s¥n", name, p); 自分の名前の部分のみを配列を使って出力: TARO printf("自分の名前の部分のみをポインタを使って出力:¥n"); 配列を使って名前のデータを書き換える: putchar(*(p + 6)); JIRO putchar(*(p + 7)); 配列を使って文字列を更新する: putchar(*(p + 8)); putchar(*(p + 9)); 自分の名前の部分のみをポインタを使って出力: putchar('¥n'); TARO ポインタを使って名前のデータを書き換える: printf("ポインタを使って名前のデータを書き換える:¥n"); JIRO *(p + 6) = 'J'; ポインタを使って文字列を更新する: *(p + 7) = 'I'; name = NFJKJ!KJSP putchar(*(p + 6)); putchar(*(p + 7)); 7.[問題] putchar(*(p + 8)); "one","two","three","four","five","six","seven","eight","nine","ten" の 10 putchar(*(p + 9)); 個の文字列をポインタの配列を用いて宣言し、ASCII コードで昇順に並び putchar('¥n'); 替えなさい。 [プログラム] printf("ポインタを使って文字列を更新する:¥n"); #include<stdio.h> while(*p){ #include<string.h> *p = *p+1; /* A を B のようにアルファベットの次の文字へ*/ ++p; #define N 10 } printf("name = %s¥n", name); int main(void) return (0); { char *p[N] = { } "one","two","three", "four","five","six", "seven","eight","nine","ten" 【実行結果】 }; 自分の名前を配列とポインタを使って出力: name = MEIJI TARO: p = MEIJI TARO char *temp; int i,j,min; five four for(i=0;i<N-1;i++) nine { one min = i; seven for(j=i+1;j<N;j++) six { ten /////文字列の比較///// three if(strcmp(p[min],p[j])>0) two { min = j; } 8.List11-5 を参考にして、あなたが在籍している大学名、学部、学科、 年、組、番号、氏名、生年月日を表示しなさい。 } /////ポインタの配列の入れ換え///// <プログラム例> temp = p[i]; #include <stdio.h> p[i] = p[min]; p[min] = temp; } int main(void) { for(i=0;i<10;i++) puts(p[i]); int i; char univ[3][20]={"明治大学","理工学部","電気電子工学科"}; char *number[3]={"1","1","100"}; return(0); } char name[2][20]={"明治","太郎"}; char *birth[3]={"1984","12","15"}; [実行結果] printf("私は eight printf(" %s %s %s の学生です。¥n",univ[0],univ[1],univ[2]); %s 年 %s 組 %s 番 ¥n",number[0],number[1],number[2]); printf(" %s #include<stdio.h> %s と申す者です。¥n",name[0],name[1]); printf(" 西 暦 %s 年 %s 月 %s 日 生 ま れ で す 。 ¥n",birth[0],birth[1],birth[2]); int main(void) { int i; return(0); char x[3][4]={"abc","def","ghi"}; } char *y[3]={"123","456","789"}; for(i=0; i<3;i++) <実行結果> 私は 明治大学 理工学部 printf("x[%d]=¥"%s¥"¥n",i,x[i]); 電気電子工学科の学生です。 1 年 1 組 100 番 明治 太郎 と申す者です。 for(i=0; i<3;i++) 西暦 1984 年 12 月 15 日生まれです。 printf("y[%d]=¥"%s¥"¥n",i,y[i]); return(0); 9.配列、ポインタを用いて a∼i の 9 文字は配列で 1∼9 の 9 文字はポ インタで 3 つずつ表示させるプログラムをつくりなさい。 例 } x[0]="abc" x[1]="def" 10.キーボードより任意の英数字を入力し、その文字列の長さを表示す x[2]="ghi" るプログラムを作成してください。 y[0]="123" y[1]="456" プログラム y[2]="789" #include<stdio.h> int length(char *str) の文字列の長さを求めよ。大文字への変換は toupper 関数を用い,文字列 { の長さはポインタを使ってプログラムを作成せよ。 int c=0; while(*str){ プログラム c++; #include <ctype.h> str++; #include <stdio.h> } return(c); } void st_toupper(char str[]) { str[0]=toupper(str[0]); int main(void) } { char str[100]; int ans; size_t length(const char *s) { size_t len=0; printf("英数字の文字列を入力してください。¥n"); while(*s++) scanf("%s",str); len++; return(len); ans=length(str); } printf("入力した文字列の長さは%d です。¥n",ans); int main(void) { return(0); char str[100]; printf("文字列を入力してください。:"); } scanf("%s",str); 11. 文字列を入力し,その頭文字を大文字にして出力せよ。また,そ st_toupper(str); printf("頭文字を大文字: %s¥n",str); *pb = tolower(*pb); printf("文字列 %s の長さは %u です。¥n",str,(unsigned)length(str)); ++pb; return(0); /* 小文字変換 */ } printf("変換後の文字列は%s です¥n", buff); } /* 表示 */ return(0); 実行結果 } 文字列を入力してください。:hisashi 実行結果 頭文字を大文字: Hisashi 文字列 : JouHOUsYOri 文字列 Hisashi の長さは 7 です。 変換後の文字列は jouhousyori です 12.大文字と小文字を含む文字列を入力し大文字を小文字変換して出力 13.文字列に指定した文字がいくつあるかを調べる関数 int count(char するプログラムを作成せよ。 *str,char c)を作成、キーボードから文字列を入力して文字の個数を調べる プログラム なさい。 #include <stdio.h> <実行例> #include <ctype.h> 文字列を入力してください。 Goodbye int main(void) 文字列から探す文字を入力してください。 { o char buff[256], *pb; pb = buff; /* 入力文字列 */ /* ポインタ変数初期化 */ Goodbye の中には o は全部で2個あります。 <プログラム> #include<stdio.h> printf("文字列 : "); scanf("%s",buff); while(*pb){ /* プロンプト表示 */ /* 文字列入力 */ /* ヌル文字まで繰り返す */ int count(char *str,char ch); int main(void) { char str[100]; char ch; printf("文字列を入力してください。¥n"); scanf("%s",str); printf("文字列から探す文字を入力してください。¥n"); fflush(stdin); scanf("%c",&ch); printf("%s の中に%c は%d 個あります。¥n",str,ch,count(str,ch)); return (0); } int count(char *str,char ch) { int c=0; while(*str){ if(*str++==ch) c++; } return c; }