C言語 文字列

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

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が最後の表示でおかしな値になっているのはなぜか?