学校の課題 文字配列

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

学校の課題 文字配列

#1

投稿記事 by こた » 2年前

文字配列の課題でつまづいております。
名前を入力し、すでにある4人の名前と一致するかを確認し返す、という課題です。
同じ名前を入力しても、「その人はいません」と返されます。
以下のコードのどこが悪いのか、教えていただけないでしょうか。
全くの初心者ですので、どうぞよろしくお願いいたします!

コード:

#include<stdio.h>

int main(int argc, char *argv[]) {
  char input[9], string[4][9] = {"ヒロシ", "サトシ", "アキコ", "ユウコ"};
  int i, j, result = 0;
  while(1){
    printf("メンバー:ヒロシ,サトシ,アキコ,ユウコ\n");
    printf("名前を入力してください:");
    scanf("%s", input);
    for (i = 0; i < 4; i++){
      for (j = 0; j < 9; j++){       
        if(input[i] != string[i][j]){
          break;
        }
        else if(input[i] == '\0' && string[i][j] == '\0'){
          result = 1;
          i = 4;
          j = 9;
        }
      }
    }
    if (result == 1){
      printf("%sはメンバにいます.\n", input);
    }
    else {
      printf("%sはメンバにはいません.\n", input);
    }
  }
  return 0;
}
 

yoko
記事: 24
登録日時: 13年前

Re: 学校の課題 文字配列

#2

投稿記事 by yoko » 2年前

プログラム実行していないのですが、
for文内、

コード:

input[i]
の添え字のiがjなのでは?

こた

Re: 学校の課題 文字配列

#3

投稿記事 by こた » 2年前

ご返信ありがとうございます!
ただ、for文内のinputをinput[j]に変えてみましたが、やはり合致している名前を入力しても「メンバではありません」になってしまいます。。ほかに考えられることがあればぜひ教えていただけると嬉しいです!

box
記事: 2002
登録日時: 13年前

Re: 学校の課題 文字配列

#4

投稿記事 by box » 2年前

文字列を比較するための標準関数
strcmp()
を使う、というのは禁止されているのですか?
もし使ってよいのであれば、無理に自作するよりは
よほど安定した結果が得られると思うのですが...。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 学校の課題 文字配列

#5

投稿記事 by box » 2年前

仮に禁止されているとしても、
strcmp 自作
とか
C言語 文字列比較 自作
とかのキーワードでググってみると、
実装のサンプルがいくらでも見つかると思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 学校の課題 文字配列

#6

投稿記事 by box » 2年前

とりあえず無限ループはいらないと思いますので、やめときましょう。

コード:

#include <stdio.h>

int main(void)
{
    char input[9], string[][9] = { "ヒロシ", "サトシ", "アキコ", "ユウコ" };
    int i, j, result = 0;

    printf("メンバー:ヒロシ,サトシ,アキコ,ユウコ\n");
    printf("名前を入力してください:");
    scanf("%s", input);
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 9; j++) {
            if (input[j] != string[i][j]) {
                break;
            }
            else if (input[j] == '\0' && string[i][j] == '\0') {
                result = 1;
                i = 4;
                j = 9;
            }
        }
    }
    if (result == 1) {
        printf("%sはメンバにいます.\n", input);
    }
    else {
        printf("%sはメンバにはいません.\n", input);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 学校の課題 文字配列

#7

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

使っている文字コードは何ですか?
UTF-8の場合、カタカナは1文字を3バイトで表す(厳密には例外があるかも?)ので、
9要素しか無い配列を使うとNUL文字が入る場所がありません。
NUL文字があったときにのみ result = 1; を実行するようになっているので、
この場合9要素しか見ないのであればresultは1にはなりません。
また、inputが9要素しか無く、scanfで読み込む最大のバイト数
(NUL文字を入れるため、最大でバッファサイズより1少ない数に設定するべき)が設定されていないため、
バッファオーバーフローを起こしてまわりのデータを破壊する危険があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

こた

Re: 学校の課題 文字配列

#8

投稿記事 by こた » 2年前

box様、みけCAT様、お返事ありがとうございます!
box様、まだstrcmp関数は習っておらず、とりあえず配列とループ文のみ既習のため、それだけでなんとかしようと苦しんでおりました。教えて頂いた通り、ネットでも検索して勉強したいと思います!無限ループはずしました。
みけCAT様、ご指摘頂いた通り、まずは配列の要素数を9→20にしてみたところ、warningはでなくなりました!ただ、やはり同一の名前を入力してもメンバにはいません、と出てしまいます。。が、ネットでも同様のコードを探して勉強しようと思います。
お二人とも、お忙しいところありがとうございました!

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

Re: 学校の課題 文字配列

#9

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

配列の要素数だけでなく、jのループの上限も増やす必要があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

こた

Re: 学校の課題 文字配列

#10

投稿記事 by こた » 2年前

ご指摘ありがとうございます。うっかりしており、ループの上限20にしました。動いて感動しました!本当にありがとうございました!

返信

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