• ベストアンサー

C++ キーボードから入力した文字を配列に

キーボードから「a、aa、b、ab、・・・」などと 文字を入力し、配列にいれたいのですが、うまくいきません。 scanf("%s", orig); とすると、 aaababのようにしか入力できないため、 「aa」のように複数の文字列を1つのものとして入力することができません。 以下にプログラムをのせたので、 ご教授お願いします! int m; unsigned char orig[500]; for(m=0;;m++){ scanf("%s", orig[m]); if(orig[m]=='E') break; }

質問者が選んだベストアンサー

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

具体的に、どのように配列の中に入ればよいのか教えてもらえませんか? unsigned char orig[500]; は「unsigned char」が500個連続しているので orig[0] = a; orig[1] = a; のように入ります。 また、aa、bbと入れた場合、今のソースでは(一部修正必要) orig[0] = a; orig[1] = b; orig[2] = b; となります。 >「aa」のように複数の文字列を1つのものとして入力することができません。 orig[0] に「aa」と格納できるものではありません。 どのように格納されるのが理想なのかがわかりませんが、最低でも、 ・入力した文字列に合わせて、次の格納先(orig[]の位置)をずらす ・二次元配列にする が必要だとは思いますが。 それと、 scanf("%s", orig[m]); ではなく scanf("%s", &orig[m]); です。 実行した場合に変な挙動をしていると思います。

sakyyy
質問者

お礼

丁寧なご回答ありがとうございます! >orig[0] に「aa」と格納できるものではありません そうなんですね、てっきり「500」の長さの文字が格納できるのだと勘違いしていました。 二次元配列が必要なんですね。 どうもありがとうございました!!

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

int m; unsigned char orig[40][500]; // 500文字入る場所が40個 for(m=0;m<40;m++){ // 40個しかないから40回まで scanf("%s", orig[m]); // scanf("%s", &orig[m][0]);と同じ意味 if(strcmp(orig[m],"E")==0) // if(strcmp(&orig[m][0],"E")==0)と同じ意味 break; }

sakyyy
質問者

お礼

迅速なご回答ありがとうございます! 2次元配列にしなければいけないんですね。 比較の仕方まで書いていただき、ありがとうございます!!

関連するQ&A

  • 入力文字と配列がわからない><

    文字列と配列がよくわかりません・・・。 以下のプログラムで「おく」と入力すると ・ ィ と表示されます・・・。 何がおかしいのでしょうか; int main(){   char a[4];   scanf("%s", a);   printf("a[0] = %c \na[1] = %c \n", a[0], a[1]); }

  • 文字型配列について質問です。

    「文字型配列にsを宣言し、初期値に[yamada tagosaku ]をセットする。この文字列を表示する。次にキーボードから入力した1文字が何個含まれているかの個数を表示する。キーボードから入力する1文字は文字型変数mに、個数をカウントする変数はctにする。流れ図に従ってプログラムを作れ。」 という問題なのですが、BcPadでエラーが出てしまいます。 困っているので、訂正箇所を教えていただければ幸いです。 流れ図はhttp://imepita.jp/20080527/718540です。 int i,ct=0; char s[20]="yamada tagosaku ",m; printf("%s\n",s); printf("探す1文字 => "); scanf("%s",m);      i=0; while(s[i]!=NULL){ if(s[i]==m) ct++; i++; } printf("%s は%d個あります。\n",m,ct); }

  • C言語 ポインタと配列

    #include <stdio.h> /* scanf("%c", &search); ではなく scanf(" %c", &search); であることに注意する */ char *str_chr(const char *str, char c) { char *find; find = NULL; do { if(*str == c) { find = (char*)str; break; } } while(*str++); return(find); } int main(void) { char str[100] = {0}; char search; char *find; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &search); find = str_chr(str, search); if(find == NULL) { puts("検索した文字は見つかりませんでした。"); } else { printf("検索した文字 %c は\"%p\"にあります。\n", *find , find); } return(0); } このコードのfind = (char*)str;の (char*)str;の部分がどうなっているのかわかりません。 あとこのfindというのは&find[0]という解釈でいいでしょうか? 教えてくださいm(_ _ )m

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • 画像を読み込む配列の確保。

    C言語について質問です。 画像を読み込む時、その画像の幅、高さを入力し、そのサイズに見合った配列を確保します。その後ファイル名を入力し、配列に読み込むプログラムを作成しました。 メインの部分のみ記述します。 int xsize, ysize, i; unsigned char **src; char filename[30]; FILE *fp; printf("ファイル名を入力してください:"); scanf("%s", filename); printf("画像の幅:");scanf("%d", &xsize); printf("画像の高さ:");scanf("%d", &ysize); src = (unsigned char **)malloc(sizeof(unsigned char *) * ysize); for(i=0; i<ysize; i++) src[i] = (unsigned char *)malloc(sizeof(unsigned char) * xsize); fp = fopen(filename, "rb"); fread(src[0], sizeof(unsigned char), xsize * ysize, fp); このように記述し、エラーもなく実行できたのですが、srcをこのまま出力すると変?な画像となって出力されてしまいました。 上のように記述した場合、矛盾する場所はあるでしょうか? そして、この方法以外に配列を確保する方法はあるでしょうか?

  • 文字列の探索

    ファイル名を指定して文字列の探索を行うというプログラムをC言語で作成したのですが、 コンパイルのときに警告で「問題のあるポインタの変換(関数 main )」と出て、うまい具合に動きません。改良点を教えてください。 #include<stdio.h> #include<string.h> #include<stdlib.h> unsigned char *s1; unsigned char *s2; unsigned char *cp; FILE *fp; char fname[64]; void TestStrStr(void); main(){ s1 = calloc(256, sizeof(unsigned char)); s2 = calloc(256, sizeof(unsigned char)); printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); TestStrStr(); return 0; } void TestStrStr(void){ cp = strstr(s1, s2); if(cp == NULL) printf("'%s'に'%s'のいずれの文字も含まれない.\n", s1, s2); else printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); }

  • C++(というよりC)で文字を置換

    現在じゃんけんさせるプログラムを作っています。その中で 0→ぐー 1→ちょき 2→パー のように変換してreturnさせる関数を作りたいのです。 現状作ったファイルをコンパイルすると VisualStudioだと エラー 1 error C2440: 'return' : 'char [20]' から 'int' に変換できません。 27 1 じゃんけん・改 2 IntelliSense: 戻り値の型が関数型と一致していません 27 9 じゃんけん・改 g++だと In function 'int Replacement(int)': 19:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "パー"; ^ 22:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "ちょき"; ^ 25:20: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] char *Replaced = "ぐー"; ^ 27:9: error: invalid conversion from 'char*' to 'int' [-fpermissive] return Replaced; ^ 17:7: warning: address of local variable 'Replaced' returned [-Wreturn-local-addr] char Replaced[20] = { 0 }; ^ In function 'int main()': 60:27: error: 'scanf_s' was not declared in this scope scanf_s("%d", &player_c); とエラーやら警告がでます。g++のscanf_sのエラーはscanfにすればいいので気にしないとして、どうすれば目的の関数が作れますか? [ソース抜粋] int Replacement(int ver){ char Replaced[20] = { 0 }; if (ver == 2){ char *Replaced = "パー"; } else if (ver == 1){ char *Replaced = "ちょき"; } else{ char *Replaced = "ぐー"; } return Replaced; /*switch (ver){ case 2: char *Replaced = "パー"; return Replaced; break; case 1: char *Replaced = "ちょき"; break; default: char *Replaced = "ぐー"; break; }*/ } void Which_is_Winner(int player_c,int cpu_c, int Judge_Which_is_Winner){ printf("じゃんけん・・・・・・ポンっ!\n"); printf("あなた:%s\nCPU:%s\nじゃんけん", Replacement(player_c), Replacement(cpu_c));//それぞれの手を表示 if (player_c == Judge_Which_is_Winner){ printf("あなたの勝ちです!\n"); } else { printf("cpuの勝ちです!\n"); } }

  • 多元配列について(ANSI C)

    動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) {      void **topPointa;      int * iDataInput;      int * iDataOutput ;      char * chDataInput;      char * chDataInput2;      char * chDataOutput1 ;      // ポインタアドレス用のメモリ確保      topPointa = (void *) calloc (10 , sizeof(void *));      if(topPointa == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      //int配列のメモリ確保      iDataInput = (int * ) calloc (10 , sizeof(int));      if(iDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      iDataInput[0] = 3 ;      iDataInput[1] = 4 ;      topPointa[0] = (void * ) &iDataInput;      //int配列の取り出し      iDataOutput = *(int *) topPointa[0];      printf( "int: %d\n", iDataOutput[0] );      printf( "int: %d\n", iDataOutput[1] );      //char配列 のメモリ確保      chDataInput = (char * ) calloc (10 , sizeof(char *));      if(chDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      chDataInput2 = (char * ) calloc (10 , sizeof(char));      if(chDataInput2 == NULL) {           printf("メモリが確保できません\n");           exit(-1);       }      strcpy(chDataInput2 , "hoe");      chDataInput[0] = &chDataInput2;      topPointa[1] = (void * ) &chDataInput;      //char配列の取り出し      chDataOutput1 = *(char *) topPointa[1];      printf( "char: %S\n", chDataOutput1[0] );      free(iDataInput);      free(chDataInput);      free(chDataInput2);      return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • 2次元配列への標準入力

    初めまして。 私は今C言語のプログラミングを勉強しています。 2次元配列へ文字列の標準入力を行い、それをプリントさせるという問題を考えています。(配列の行の要素はMAXに達しなくても空行が入力されたら 終了させたい。) 下のようなプログラムを書きましたが、空行を入力してプリントする際に 文字が崩れてしまって上手く表示されませんでした。 初歩的で恐縮ですが、どのように改善したら良いか、 教えて頂けたら嬉しいです。 #include <stdio.h> #include <ctype.h> #define MAX 10 int main(){ char array[MAX][MAX]; int i; for(i = 0; i < 10; i++){ fgets(array[i],sizeof(char)*MAX,stdin); if(array[i][0] == '\n') break; } for(i = 0; i < 10; i++){ printf("%s", array[i]); } return 0; }

専門家に質問してみよう