scanf / printf 以外の入出力関数と、文字処理ライブラリを学ぶ。
1文字単位で入出力する関数。stdio.h に含まれる。
| 関数 | 動作 | 使い方 |
|---|---|---|
getchar() | キーボードから1文字読み込む | int c = getchar(); |
putchar(c) | 1文字を画面に出力する | putchar(c); |
getchar() の戻り値は int。EOF(入力終了)を扱うため int で受け取るのが正確。char に代入しても問題ない。
#include <stdio.h>
int main(void)
{
char c;
printf("1文字入力してください: ");
c = getchar();
printf("入力された文字: ");
putchar(c);
printf("\n");
return 0;
}
1文字入力してください: A 入力された文字: A
#include <ctype.h> で使える文字処理関数。
| 関数 | 意味 | 真になる例 |
|---|---|---|
isalpha(c) | 英字かどうか | 'A', 'z' |
isdigit(c) | 数字(0〜9)かどうか | '0', '9' |
islower(c) | 小文字かどうか | 'a', 'z' |
isupper(c) | 大文字かどうか | 'A', 'Z' |
isspace(c) | 空白文字かどうか | ' ', '\t', '\n' |
toupper(c) | 小文字 → 大文字に変換 | 'a' → 'A' |
tolower(c) | 大文字 → 小文字に変換 | 'A' → 'a' |
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c;
printf("1文字入力してください: ");
c = getchar();
if (isalpha(c)) {
printf("英字です。大文字変換: %c\n", toupper(c));
} else if (isdigit(c)) {
printf("数字です。\n");
} else {
printf("その他の文字です。\n");
}
return 0;
}
1文字入力してください: a 英字です。大文字変換: A
#include <string.h> で使える文字列処理関数。
| 関数 | 意味 | 使い方 |
|---|---|---|
strlen(s) | 文字列の長さを返す | strlen("hello") → 5 |
strcpy(dst, src) | 文字列をコピー | strcpy(buf, "abc") |
strcat(dst, src) | 文字列を末尾に連結 | strcat(a, b) |
strcmp(s1, s2) | 文字列を比較(0なら一致) | strcmp(a, b) == 0 |
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[50] = "Hello";
char b[50] = "World";
printf("長さ: %d\n", (int)strlen(a));
strcat(a, b); /* a の末尾に b を連結 */
printf("連結後: %s\n", a);
if (strcmp(a, "HelloWorld") == 0) {
printf("一致しました\n");
}
return 0;
}
長さ: 5 連結後: HelloWorld 一致しました
strcat は dst の配列サイズに余裕がないとバッファオーバーフローになる。scanf("%s", ...) はスペースの手前で止まる。
スペースを含む文字列を読み込むには fgets() を使う。
fgets(配列名, サイズ, stdin);
#include <stdio.h>
#include <string.h>
int main(void)
{
char name[50];
printf("名前を入力してください(スペースOK): ");
fgets(name, sizeof(name), stdin);
/* fgets は末尾に \n を含む場合があるので除去 */
name[strcspn(name, "\n")] = '\0';
printf("こんにちは、%s さん!\n", name);
return 0;
}
名前を入力してください(スペースOK): Yamada Taro こんにちは、Yamada Taro さん!
strcspn(name, "\n") は文字列中の \n の位置を返す。'\0'(文字列終端)を代入することで改行を除去できる。
英字1文字を入力し、小文字なら大文字に、大文字なら小文字に変換して表示せよ。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c;
printf("英字を1文字入力してください: ");
c = getchar();
/* ここに変換処理を書く */
return 0;
}
if (islower(c)) {
printf("大文字: %c\n", toupper(c));
} else if (isupper(c)) {
printf("小文字: %c\n", tolower(c));
} else {
printf("英字ではありません\n");
}
文字列を入力し、長さを表示するプログラムを作れ。strlen を使うこと。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100];
printf("文字列を入力してください: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; /* 改行除去 */
/* ここに長さ表示を書く */
return 0;
}
printf("文字数: %d\n", (int)strlen(str));
Q1. getchar() の説明として正しいものはどれか。
正解:イ
getchar() は標準入力から1文字読み込む関数。戻り値は int 型。
Q2. isdigit('7') の戻り値はどれか。
正解:イ
'7' は数字文字なので isdigit は真(0以外)を返す。
Q3. strcmp(a, b) が 0 を返すとき何を意味するか。
正解:ア
strcmp は a==b なら 0、a<b なら負、a>b なら正を返す。
Q4. scanf("%s", name) と fgets(name, ...) の違いとして正しいものはどれか。
正解:イ
scanf の %s はスペースを区切り文字として扱うため途中で止まる。fgets は改行まで(またはサイズ上限まで)を読み込む。