質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

6回答

7642閲覧

0x81のなんていうの?あと、簡単な関数がわかりません・・・

JhonDoe

総合スコア36

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/07/20 04:36

ほとんどわかりません。わからないところをコメントしてみました

int IsKanji1st(int c)
{
unsigned char uch = c;

if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xfc)

//0x81とか何っていうんですか?
return 1;
else
return 0;
}
int main(int argc, char *argv[])
{
int n;
while((n = getchar())!= EOF)
{
if(IsKanji1st(n)){
//Helloって入力したとして、10100001とかが帰ってくるの?
putchar(n);
putchar(getchar());
//どうしてputchar(getchar()、もう一つ必要なんですか?
continue;
}
else
putchar(toupper(n));
}

return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

0x81とか何っていうんですか?

整数リテラル。とか、16進数リテラル、とも呼ばれるかもしれません。

Helloって入力したとして、10100001とかが帰ってくるの?

シフトJISの先導バイトを検出しようとしているようなので Hello なら 0 0 0 0 0 ではないかと思います。

どうしてputchar(getchar()、もう一つ必要なんですか?

先導バイトの次にある後続バイトを読み込んで出力するためです。

もう少しわかりやすく言い換えると・・・

Shift_JIS ではいわゆる全角文字は2バイトで構成されています。が、getchar は1バイトしか読み込みません。
そのため、getchar で読み込んだ文字が全角文字の1バイト目であるかどうかを判別して、もしそうなら、その次には全角文字の2バイト目があるはずなので、それを putchar(getchar()) で、読んで、読んだ内容をそのまま出力しています。

投稿2015/07/20 05:53

編集2015/07/21 10:19
ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

いまさらですけど、投稿練習を兼ねて。 (^.^;;;

コメントを付け直してみました。

C

1/* 2 与えられた1バイトが2バイト文字(いわゆる全角文字?)の1バイト目かどうかを判定し 3 その結果を返す. 4*/ 5int IsKanji1st(int c) 6{ 7 unsigned char uch = c; 8 9 /* データが 81H~9FHもしくは、E0H~FCH の場合を該当とする */ 10 if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xfc) 11 return 1; 12 else 13 return 0; 14} 15 16/* 17 コンソールから文字列を読み込み、エコーバックする 18 このとき、2バイト文字はそのまま、1バイト文字は可能なら大文字化して表示する 19 ex.) 20 Hellow! こんにちわ → HELLOW! こんにちわ 21*/ 22int main(int argc, char *argv[]) 23{ 24 int n; 25 while((n = getchar())!= EOF) 26 { 27 if(IsKanji1st(n)){ 28 /* 読み出した1バイトが2バイト文字の最初の文字だった */ 29 putchar(n); /* 1バイト目をエコーバック */ 30 putchar(getchar()); /* 続く2バイト目を読み出してそのままエコーバック */ 31 continue; 32 } 33 else 34 /* 1バイト文字の場合は、大文字化してエコーバック */ 35 putchar(toupper(n)); 36 } 37 38 return 0; 39}

投稿2015/11/09 20:35

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1バイトコードがASCIIと同じになっている文字コードの前提になります。

0x81とか何っていうんですか?

0x81などの0xで始まる数値は、16進数の整数リテラルですね。

Helloって入力したとして、10100001とかが帰ってくるの?

nに最初に帰ってくるのはHだったら10進数で72、16進数で0x48の値が返ってきます。2進数だったら0b01001000ですね。

どうしてputchar(getchar()、もう一つ必要なんですか?

マルチバイト文字、この場合は2バイトを想定しているんだと思いますが、漢字などを1文字として出力するために、1バイト目と2バイト目を一度に出力しています。

投稿2015/07/20 05:35

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

>0x81のなんていうの?あと、簡単な関数がわかりません・・・
文系の方、プログラミングの素養、基礎学習が無い方が、いきなり、
掲示な様な事と、状況へ、投げ込まれて、当惑している?
背景説明、状況説明出来などを、できないのでしょうか?
>//0x81とか何っていうんですか?
ぜろ、えっくす、エイト、ワン
ジェロ、エっクス、エイティ、ワン
まる、バツ、はち、いち
互いに、意志疎通できれば、何でも良いのでは?
通話状態が悪い時などは、まる、バツ、八丁味噌の八、ファーストの1とか、
アルファ、ベータ他例えも。
チェックメイトキングツー、チェックメイトキングツー、フォックストロット、、、、、など
詳しくはしりませんが、映画で見るだけな、軍用無線コードもあったり。
規約があるのであれば、規約を覚えてください。
常識とされる雰囲気があるのであれば、
自らに取って、常識でない事を、相手、環境へ説明して、学習してください。

投稿2015/07/20 05:13

編集2015/07/20 05:19
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

//0x81とか何っていうんですか?
16進数の定数で、「ハチイチエッチ」でも「ゼロエックスハチイチ」でも「八十一エッチ」でも。

//Helloって入力したとして、10100001とかが帰ってくるの?
0ですよ。Hもeもlもoも\nも全て一バイト文字だから、いつも0です。
ん?「\n」。改行も入力されます。

このプログラムは、
・入力された文字列を大文字にして表示。但し漢字は変換しない。
・漢字コードはShift JISを想定。
という仕様であるようなので、

//どうしてputchar(getchar()、もう一つ必要なんですか?
漢字の2バイト目が英語の小文字だったら処理されてしまうので、処理させないようにしています。

漢字の処理は熟練者でも泥臭くなるので、学習用には不向きだと思います。

投稿2015/11/11 14:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int main(int argc, char *argv[])
{
int n;
while((n = getchar())!= EOF) //入力1文字をnへ入れる
{
if(IsKanji1st(n)){ // 1 or 0を返す
putchar(n); // nを出力
putchar(getchar()); //入力を受けて出力
continue; // whileへ戻る
}
else
putchar(toupper(n)); // nを大文字へ変換して出力
}

return 0;

}

キーボードで入力した1文字をIsKanji1st()これで、大文字に変換できる文字なら
変換して、そうでない場合はそのまま出力、もう1回入力を受ける putchar(getchar());は私もわかりませんでした。
0x81は16進数です。 char型を比較するときに使いますね。(文字操作等)

投稿2015/07/21 10:08

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問