getcharを使った配列への代入

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
OT

getcharを使った配列への代入

#1

投稿記事 by OT » 9年前

はじめましてこんばんは

C言語初心者のOTという者です。
調べても分からないことがありましたので2つほど質問させていただきます。(調べ方が悪いのかもしれません…)


現在、私はC言語の課題を進めています。その中で、

[getchar関数で入力した文字を配列に格納させる]

という処理をさせなければいけない箇所があるのですが、
どういうをコードを書いたらいいのかわかりません。

なのでgetcharを使った配列への代入方法を教えてください。


もう一つの質問は、C言語初心者におすすめの書籍を教えてください。

よろしくおねがいします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: getcharを使った配列への代入

#2

投稿記事 by みけCAT » 9年前

OT さんが書きました:現在、私はC言語の課題を進めています。その中で、

[getchar関数で入力した文字を配列に格納させる]

という処理をさせなければいけない箇所があるのですが、
どういうをコードを書いたらいいのかわかりません。

なのでgetcharを使った配列への代入方法を教えてください。
具体的にどういう処理をしたいのかがわからないですが、代入するだけなら普通に代入すればいいでしょう。

コード:

int hairetu[1];
hairetu[0] = getchar();
OT さんが書きました:もう一つの質問は、C言語初心者におすすめの書籍を教えてください。
すみません、私にはよくわからないので他の人に聞いてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

超初級者
記事: 56
登録日時: 11年前

Re: getcharを使った配列への代入

#3

投稿記事 by 超初級者 » 9年前

まあこんな感じでやってみてください。

コード:

#include <stdio.h>

#define N (20)

int main(void)
{
   int arr[N], i, j;

   for (i = 0; i < N; i++)
       if ((arr[i] = getchar()) == EOF) break;
   for (j = 0; j < i; j++) putchar(arr[j]);
   putchar('\n');
   return 0;
}

OT

Re: getcharを使った配列への代入

#4

投稿記事 by OT » 9年前

みけCATさん

お返事ありがとうございます。
私が言葉足らず過ぎたため意図した回答は得られませんでした、申し訳ないです。

仕様は下記のになっていましてgetcharを使わないでgetsを使うことでならなんとか作成することが出来ました。
ですがgetcharを使うとよくわからないことになってしまいます。


キーボードで入力した文字列を加工して表示するプログラムを
作成してください。
・入力できる最大文字数は半角20文字とする。
・入力したものは配列に格納する。
・文字数が半角20文字でない場合も20文字表示する。
・文字数が足らない部分はピリオドを表示する。
・20文字以上を入力した場合でも、配列サイズを超えることが無いようにする。
・キーボードからの入力は、getchar()関数を使用する。

getcharを使おうとするとコードが複雑になっていき、自分が今なにをやっているのかわからなくなる始末です。
そんなに難しい事では無いかもしれませんが知恵をお貸しいただきたいです。



超初心者さん
返信ありがとうございます。
言葉足らずでしたのに察していただいてありがとうございます。

私もその書き方にまではたどり着きました…
ですがif文のコードブロックのところで指定した文字数を入力するまで処理を終われないみたいです。
20文字未満の文字を入力した時にも処理が進むコードがわからないのでよろしければ教えていただきたいです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: getcharを使った配列への代入

#5

投稿記事 by みけCAT » 9年前

OT さんが書きました:仕様は下記のになっていましてgetcharを使わないでgetsを使うことでならなんとか作成することが出来ました。
(中略)
・20文字以上を入力した場合でも、配列サイズを超えることが無いようにする。
本当ですか!?getsを使っているのに配列サイズを超えることが無いなんて、xv6上で動くアプリケーションの開発をしているのですか?

[hr]
とりあえずxv6ではなく、「普通」のWindowsやLinuxなどをターゲットにした、getchar()を使ってstdinから1行読み込むプログラムです。
改行文字はバッファに書き込みません。バッファに入りきらない文字は捨てられます。
戻り値は入力された文字数、1文字も読み込まずにEOFだった場合は-1を返します。

コード:

#include <stdio.h>

int get_one_line(char *out, int buffer_size) {
    int len = 0;
    for(;;) {
        int input = getchar();
        if (input == EOF) {
            if (len < buffer_size) out[len] = '\0';
            if (len == 0) return -1; else return len;
        } else if (input == '\n') {
            if (len < buffer_size) out[len] = '\0';
            return len;
        } else {
            if (len + 1 < buffer_size) out[len] = input;
            else if (len + 1 == buffer_size) out[len] = '\0';
            len++;
        }
    }
}

int main(void) {
    char buf[21];
    int len = get_one_line(buf, sizeof(buf));
    printf("length = %d\nstr = %s\n", len, buf);
    return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: getcharを使った配列への代入

#6

投稿記事 by かずま » 9年前

コード:

#include <stdio.h>

int main(void)
{
    char s[20]; int c, n, i = 0;

    for (n = 0; n < 20 && (c = getchar()) != '\n'; n++) s[n] = c;
    while (i < n) putchar(s[i++]);
    while (i++ < 20) putchar('.');
    return 0;
}
行入力でないなら、'\n' を EOF に変えてください。

閉鎖

“C言語何でも質問掲示板” へ戻る