C言語 文字列
C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)
- 作者: 倉薫
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/13
- メディア: 大型本
- 購入: 3人 クリック: 14回
- この商品を含むブログ (3件) を見る
C言語では、文字列を文字の配列として扱う。例えばgenomeなら、6つの文字の配列 char a[6]として扱う。a[0] = gだし、a[5] = eとなる(成分の開始番号は0)。実際は、文字列の最後にはnull文字 \0が必要。らしい。
文字列操作を行う関数を使ってみた。(本で学んだ関数の知識を、自分なりに使った)
使った関数を整理しておくと:
- gets() 文字列の入力を要求する関数。入力値は引数に代入される。 <studio.h>
- atoi() 文字列を整数に変換する関数。gets() → atoi()の順番で使う。<stdlib.h>
- strcpy() 文字列の代入を行う関数。第1引数に第2引数を代入する。<string.h>
- strncpy() 同上。ただし、第3引数で文字列の長さを指定した上で行う。<string.h>
- strcmp() 第1引数と第2引数が等しい場合に0を返す関数。<string.h>
- strcat() 第1引数の後ろに第2引数を結合する関数。 <string.h>
- strlen() 文字列の長さ(バイト数)を測る関数。 <string.h>
- sprintf() フォーマットを指定した文字列を生成。詳細は下記参照。<studio.h>
#include <stdio.h> #include <stdlib.h> //関数 atoi を使用するため #include <string.h> //関数 strcpy,strncpy,strcmp,strcat,strlen を使用するため main () { char str[10]; //文字配列の定義。10は文字列の長さの上限値 int num; puts("何でもよいので、数値を入力して下さい。"); gets(str); //キーボードから入力する関数gets num = atoi(str); //入力した文字列を数値に変換する関数atoi(数値以外を入力すると0) printf("入力された数値は%dです\n",num); //文字が入力された場合は0が返る strcpy(str,"でも実は違います"); //文字列の代入に用いるstrcpy関数 puts(str); strncpy(str,"ちなみに、文字列が長すぎると配列オーバーを招くので危険です",9); //文字列の上限数を設定して代入するstrncpy関数 str[9] = '\0'; //strは上限値10。最後にnull文字を付加する puts(str); puts("ところで、パスワードを入力して下さい。"); char pass[50]; gets(pass); if (strcmp(pass,"password") == 0) { //引数の一致に対して0を返す関数 strcmp関数 puts("OKです"); } else { puts("NGです"); } puts("次に、文字列を結合してみましょう。"); char a[100]; char b[100]; puts("1つめを入力してください"); gets(a); puts("2つめを入力してください"); gets(b); strcat(a,b); //第一引数に、第二引き数を結合する関数 strcat関数 puts(a); printf("入力した文字列の長さは%dです\n",strlen(a)); //文字列の長さを返す strlen関数 puts("最後にsprintif関数の練習です。"); puts("今まで入力した値をおさらいします。"); char osarai[1000]; sprintf(osarai,"%d,%s,%s,%s",num,pass,a,b); //文字列をまとめる関数sprintf puts(osarai);
}
出力は以下。
何でもよいので、数値を入力して下さい。 123 //入力した値 入力された数値は123です でも実は違います ちなみ ところで、パスワードを入力して下さい。 password //入力した値 OKです 次に、文字列を結合してみましょう。 1つめを入力してください 今日は //入力した値 2つめを入力してください 雨です //入力した値 今日は雨です 入力した文字列の長さは18です //不明点1 最後にsprintif関数の練習です。 今まで入力した値をおさらいします。 -476741143,password,今日は雨です,雨です //不明点2
【不明点】
- 全角ひらがなの場合、文字列の長さは1文字あたり3カウントされているが、なぜか?
- atoi関数で文字列から数値に変換した値を格納したnumが最後の表示でおかしな値になっているのはなぜか?