ほとんどわかりません。わからないところをコメントしてみました
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア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
総合スコア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
総合スコア9388
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
>0x81のなんていうの?あと、簡単な関数がわかりません・・・
文系の方、プログラミングの素養、基礎学習が無い方が、いきなり、
掲示な様な事と、状況へ、投げ込まれて、当惑している?
背景説明、状況説明出来などを、できないのでしょうか?
>//0x81とか何っていうんですか?
ぜろ、えっくす、エイト、ワン
ジェロ、エっクス、エイティ、ワン
まる、バツ、はち、いち
互いに、意志疎通できれば、何でも良いのでは?
通話状態が悪い時などは、まる、バツ、八丁味噌の八、ファーストの1とか、
アルファ、ベータ他例えも。
チェックメイトキングツー、チェックメイトキングツー、フォックストロット、、、、、など
詳しくはしりませんが、映画で見るだけな、軍用無線コードもあったり。
規約があるのであれば、規約を覚えてください。
常識とされる雰囲気があるのであれば、
自らに取って、常識でない事を、相手、環境へ説明して、学習してください。
投稿2015/07/20 05:13
編集2015/07/20 05:19総合スコア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
総合スコア1021
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。