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

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

ただいまの
回答率

90.48%

  • C

    4641questions

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

  • 配列

    627questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

配列の要素内に入力した単語を比較参照したい。

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 99

saje

score 2

下記のようなプログラムを実行したいのですが、うまくいかず悩んでいます。
要素内にうまく単語を読み込めていないようなのですが、原因がわかりません。
改善策をご教授いただけないでしょうか。

【内容】
①入力する単語数を指定
②配列を用いて各要素に単語を入力
③特定の単語(変数b)があればカウントを+1し、次の7要素は比較せず飛ばす
④集計結果を表示する

それと、要素をprintfで出力しようとするとき&を使用しないとエラーがおきるのですがなぜなのでしょうか。

#include <stdio.h>
int main(){
    char a[2000],*b="hukuoka";
    int i=0,j,n=0;
    scanf("%d",&j);
    for(;i<j;i++)scanf("%s",&a[i]);
    for(i=0;i<j;i++){
        //printf("a[%d]=%s\n",i,&a[i]);
        if(a[i]==*b){
            i+=7;
            n++;
        }
    }
    printf("%d",n);
    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

char a[2000];と定義した場合
aは2000個の文字列ではなく、2000文字分の文字です。
言い換えると最大2000文字の文字列が1つです。

それと、要素をprintfで出力しようとするとき&を使用しないとエラーがおきるのですがなぜなのでしょうか。

a[i]とは、文字列ai番目の1文字を指しているので
%sが文字を表示するための書式なのでエラーになります。


追記

入力した単語をプログラムが覚えておく必要はあるのでしょうか?
みた感じ、カウントだけ終わったら忘れても構わないように思います。

次の7要素は比較せず飛ばす

7要素とは、単語7個ですか?
現状のプログラムでは、格納位置を7文字ずらし、末尾の7単語を捨てているだけです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/08 16:12

    回答してくださりありがとうございます。
    文字を入力していくと1要素に1文字になってしまうんですね。
    変数宣言のところで{}を使って単語を入れるやり方があったのでずっと勘違いしていました。
    printfでエラーがおきたのにも納得がいきました。

    >>次の7要素は比較せず飛ばす
    7単語という意味で合っています。

    >>入力した単語をプログラムが覚えておく必要はあるのでしょうか?
    その発想が浮かばすこのような形になってしましました。

    教えていただいたことを踏まえてもう一度作り直してみます。

    キャンセル

0

こんな感じでどうでしょうか?
変数名は合わせました.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int NumberOfData(void) {
    char buf[256];
    fgets(buf, sizeof(buf), stdin);
    if (atoi(buf) > 0) return atoi(buf);
    exit(1);
}
int main(int argc, const char * argv[]) {

    char *a, b[]= "hukuoka";
    int i, j, n = 0;

    j = NumberOfData();
    a = (char *)malloc(sizeof(char) * j);
    for (i=0; i<j; i++) {
        scanf("%s", &a[i]);
        while (getchar() != '\n');
    }
    for (i=0; i<j; i++) {
        if (strcmp(&a[i], b) == 0) {
            n++;
            i += 7;
        }
    }
    printf("個数: %d\n",n);
    free(a);
    return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C

    4641questions

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

  • 配列

    627questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。