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

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

ただいまの
回答率

90.32%

  • C

    3997questions

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

getcharが上手く使えません

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 193

mirai_kobo

score 3

 前提・実現したいこと

プログラミング初心者です。
初めて質問させていただきます。
getchar関数を使って文字入力をしようと考えています。
この関数は一文字を入力できるとのことなので、配列に入れて繰り返し処理をしようと考えています。
forループを回した後に配列の中身が表示されるというものです。

 発生している問題・エラーメッセージ

処理結果は以下の通りです。

入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
入力 -> 7
1469487808
終了
続行するには何かキーを押してください

 該当のソースコード

/* ヘッダファイル読み込み */
#include <stdio.h>

/* main関数 */
int main() {

    int i = 0;                        /*カウント用変数*/
    int a[11] = 0;                    /*入力された文字を格納するための変数*/

    for (i = 0; i < 10; i++) {        /*iを10回回す*/
        printf("入力 -> ");            /*入力を促すメッセージ*/
        a = getchar;                /*getchar関数を使ってa配列に文字を格納*/
        while(getchar() != '\n');    /*Enterを入力するまでは回す*/
    }

    printf("%d \n", a);
    printf("終了 \n");                /*a配列を表示する*/

    return 0;                        /*正常終了*/

}

 補足情報(FW/ツールのバージョンなど)

OS:Windows10
開発環境:Microsoft Visual Studio 2017 Community

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

配列の基本的な使い方が出来ていないのかなと思いますので、その辺りのおさらいをしてみてください。
よくわからない箇所があれば聞いてください。

  • 配列の要素数は今回は10回分しか使っていませんので、a[10]で良いです。
  • 配列の中身をすべて0で初期化する場合は int a[10] = {0};と書けます(初期化時のみ)。
  • a = getcharは手元ではコンパイルエラーでしたのでa[i] = getchar(); にします。
  • 配列の出力はaだけでは先頭アドレスの値が出るだけですので、forで回しつつ各要素を出力してあげる必要があります。
  • getchar()は文字コードを返す関数ですので、printfでは%cを利用し、整数ではなく文字を出力します。
#include <stdio.h>

/* main関数 */
int main() {

    int i;                        /*カウント用変数*/
    int a[10] = {0};                    /*入力された文字を格納するための変数*/

    for (i = 0; i < 10; i++) {        /*iを10回回す*/
        printf("入力 -> ");            /*入力を促すメッセージ*/
        a[i] = getchar();                /*getchar関数を使ってa配列に文字を格納*/
        while(getchar() != '\n');    /*Enterを入力するまでは回す*/
    }

    /*a配列を表示する*/
    for (i = 0; i < 10; i++) {
        printf("%c \n", a[i]);    
    }

    printf("終了 \n");                
    return 0;                        /*正常終了*/

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 10:56

    ありがとうございます。
    解決しました。

    キャンセル

+1

パッと見て気になった点。

a = getchar;

関数呼び出しになっていません。
getchar()と書きましょう。
またaは配列なのだからa[i]と書きましょう。

printf("%d \n", a);

aは配列なのでこの書き方ではアドレスしか出力されません。
ループで回すなどして出力しましょう。

for(i = 0; i < 10; i++){
    printf("%d\n", a[i]);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 10:55

    ありがとうございます。
    解決しました。

    キャンセル

+1

        a = getchar;                /*getchar関数を使ってa配列に文字を格納*/
        while(getchar() != '\n');    /*Enterを入力するまでは回す*/

getchar関数というのは、キーボードからの文字を一文字取得する関数です
ですんで、その返り値はint型で、文字列は出てきません

ということで、このコードは動きません。
そもそもコンパイルエラーにならないのが不思議ですが

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 10:57

    ありがとうございます。
    解決しました。

    キャンセル

+1

for (i = 0; i < 10; i++) {
    printf("入力 -> ");
    a = getchar;               /* 指摘1、2 */
    while(getchar() != '\n');  /* 指摘3 */
}


指摘1)
C言語における関数の使用方法を間違えています。
上記のコードは、getchar関数のアドレスを変数aに代入していることになります。
関数を呼ぶときは、「()」が必要です。

指摘2)
配列の使用方法を間違えています。
a は配列を示していますが、そこにイコールで代入しても、漸次要素に追加されるわけではありません。
(少なくともC言語はそんな便利にはできていません。)
ここで、各要素に代入するには、「a[i]」と記載する必要があります。

指摘3)
指摘1でgetcharの実行結果が取得できていない一方、while文内のgetchar()は実行され、文字を取得していますが、どこにも代入されずに捨てられています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 10:57

    ありがとうございます。
    解決しました。

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    3997questions

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