• ベストアンサー

文字列を配列化する方法を教えてください!

1列の文字列を配列化する方法を教えてください。 メモリの確保らしいのですが、参考になるソースが拝見できれば嬉しく・・・main から参照したいです。 char Text[] = "AAAA\nBBBB\nCCCCCCCC\nDDD\n";  ↓ char str[0] = "AAAA";    str[1] = "BBBB";    str[2] = "CCCCCCCCC";    str[3] = "DDD"; どうやったらいいのか全くイメージがわかないので、 よろしく御願いします!

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

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

「あくまで変換、するというところがキーなのです」 というのが、どういう意味かいまいち不明ですが、 普通なら、strtokでやるのが一番簡単でしょう。 メモリの確保なんて全然してませんが、適当な例です。 (コンパイルも行っていません) int main() char text[100], *str[10], *p; int i; strcpy(text, "AAAA\nBBB...."); i=0; for(p=strtok(text,"\n"); p!=NULL; p=strtok(NULL,"\n")) { str[i++] = p; if(i==10)break; } ..... } str[?]には、"AAAA"等の文字列ポインタが入りますが これらはtext変数上の領域です。 (text変数内の"\n"は"\0"に変換されてます!) まずい場合は、mallocした上で、コピーするなどします。 strtokを使うのがイヤで自前でするなら、strchrなどで 改行文字を地道に探すしかないでしょう。

windy88
質問者

お礼

専門家からのご回答ありがとうございます。

その他の回答 (3)

回答No.4

あくまで私の場合はこうやると言う例です。 コンパイルしてないので、うまく動かないかもしれないがその場合は自分で直して下さいね。 (全角でインデントしているので注意) char Text[] = "AAAA\nBBBB\nCCCCCCCC\nDDD\n" char str[10][20]; int len = strlen(Text),cnt,cnt1=0,cnt2=0; for (cnt=0;cnt<len;cnt++) {   if (Text[cnt]=='\n')   {     cnt1++;     cnt2=0;     continue;   }   str[cnt1][cnt2++]=Text[cnt]; } malloc等は使っていませんので必要ならば直して下さい。

windy88
質問者

お礼

ありがとうございます。 参考になりました。

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.3

char str[0] = "AAAA";    str[1] = "BBBB";    str[2] = "CCCCCCCCC";    str[3] = "DDD";  ↓ char Text[] = "AAAA\nBBBB\nCCCCCCCC\nDDD\n"; への変換のほうがコストが安いので 最初から char* str[] = {  "AAAA",  "BBBB",  "CCCCCCCCC",  "DDD",  NULL }; と宣言するば

windy88
質問者

お礼

ありがとうございます。

  • ret
  • ベストアンサー率40% (8/20)
回答No.1

strtokで\n毎に取り出して 各配列に入れるというのはだめなのですか?

windy88
質問者

お礼

ありがとうございます。 あくまで変換、するというところがキーなのです。

関連するQ&A

  • 二次元配列による文字列の配列の受渡しについての質問です。

    二次元配列による文字列の配列の受渡しについての質問です。 #include <stdio.h> void print_pname(char str[][5], int n) { int i, j; for (i = 0; i < n; i++) { printf("str[%d] = \"", i); for (j = 0; str[i][j] != '\0'; j++) putchar(str[i][j]); printf("\"\n"); } } int main(void) { char ary[][5] = {"Lisp", "C", "Ada"}; print_pname(ary, sizeof(ary) / sizeof(ary[0])); return 0; } 上のプログラム中の関数print_pnameの引数char str[][5]についてですが char (*str)[5](配列のポインタ)と変更した場合にwarningが多数発生します。 これはどうしてでしょうか? また、上のプログラムを配列のポインタを使って変更することは可能でしょうか? 以上、よろしくお願いします。

  • 文字列扱い方

    構造体の中の配列へ文字列を入れる方法がわからなくてこまっています! #include <stdio.h> struct TEST{     char str[32]; }; int main(){     TEST test;     test.str = "test";     return 0; } このように入力するとconst char [5]' から 'char [32]' に変換できません。と出てしまいます。 何か良い方法がありましたらぜひご教授お願いいたします。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • mainから渡した文字列を関数内で書き換え

    非常に基礎的な質問で申し訳ないのですが mainから渡した文字列を関数内で書き換えることができません。 int型の整数やchar型一文字はできるのですが。。。 例えば以下のようなソースでmainのABCをDEFに書き換えたいとき どのようにすればいいのでしょうか。 (関数の戻り値で変更という方法以外で) 以下のソースでは値は書き換わりませんでした。 void func(char *str2) { str2 = "DEF"; } int main() { char str1[20] = "ABC" printf("%s", str1); //ABC func(str1); printf("%s", str1); //DEFになるようにしたい }

  • 配列内の文字列を読み込む方法

    C++言語において質問です。あまり詳しくないので、変な質問でしたらすみません。 配列の文字列内にスペースが有る場合とない場合で表示を分けるものを作りたいと 思っています。 以下のようなものを書いた所、動くけど『iがいらない』、『メモリリークしている』 という風に言われました。自分でも調べてみたのですが、2つの事を解決できません。 どのようにすればよいのか、お教え願えませんか。 又、この場合のメモリリークとはどういう意味なのでしょうか? #include <stdio.h> #include <string.h> #include <ctype.h> char* name_list[] = {"", "AAA A", "BBBB", 0}; void main(){ int i = 1; char *b=0; for(char** a = &name_list[1]; *a != 0; a++, i++){ for(char* p = *a; *p != '\0' && !isspace((unsigned char)*p); p++) ; if(*p != '\0'){ b = new char[strlen(name_list[i]) + 3]; sprintf(b, "space %s", name_list[i]); } else { b = new char[strlen(name_list[i]) + 1]; strcpy(b, name_list[i]); } fprintf(stderr, "%s\n", b); } return; }

  • 文字列の動的確保とポインタ配列について

    C言語についての質問です。 現在、キーボードから文字列を読み込みファイルに保存するプログラムを作成しています。 プログラムの条件は、以下の通りです。 1: キーボードから英数字(最長でMAX_LEN(1000)-1文字)を入力して文字列(文字配列)dataに格納後、画面に表示する。 2: 入力された文字列と同じ長さの文字列を格納する領域を動的に確保し、文字列dataをその領域に コピーする。なお、必要な文字配列の長さは文字列の長さ+1バイトである。 3: 文字列endが入力されるか、入力された文字列がNUM_STRING(10)個になるまで1~2の処理を繰り返す 4: 各文字列へのポインタを格納する(char *)型ポインタの配列str_p(サイズ:NUM_STRING)を定義して利用する。 5:1~2の処理が終了した後で、メモリに格納されたすべての文字列をファイルに出力する。ファイル名はoutput.txtとし、最初の行に文字列の個数を、次の行以降に入力された順番と「逆の順番」で文字 列を出力すること。 実行例 input ->st22 st22 input->st1 st1 end ファイルの中身 2 st1 st22 現在完成しているプログラムは以下の通りです。 #include<stdio.h> #include<string.h> #include <stdilb.h> #define NUM_STRING 10 #define MAX_LEN 1000 int main (void) { int n, i; char data[MAX_LEN] = {}; char *str_p[NUM_STRING]; FILE *fp; do { printf("input->"); scanf("%s", data); if (strcmp(data, "end") == 0) { break; } else { printf("%s\n", data); n++ 2の処理 } while(n <= NUM_STRING); if ((fp = fopen("output.txt", "w")) == NULL) { fprintf(stdout, "File open error\n"); } fprintf(fp, "%d\n", n); for (i = n-1; i>0; i--) fprintf(fp, "5s\n", str_p[i]); fclose (fp); return 0; } 特に動的確保のところがよく分かりません。 回答よろしくお願いします。       

  • 長い文字列を配列に入れるには?

    VBから長い文字列を送って,c言語で受け取りたいのですが,うまく配列に入れることが出来ません.文字列サイズは最低でも4000バイト必要です. #include <stdio.h> #include <stdlib.h> #include <string.h> //VBから送られてくるデータ char getch[4000]="start1T\tpose 0 0 -5 0 -5 0 -5 0 -5 0 0 0 0 0\ ..省略.. 25\t\n"; void main(void){ char *token; char seps[]="\t\n"; FILE *pose; pose=fopen("pose.txt","a"); if((token=strtok(getch,"\t"))==NULL){ printf("Error File1\n"); exit(1); } printf("%s\n",token); while(strcmp(token,"\n")!=0){ token=strtok(NULL,"\t"); fputs(token,pose); fputs("\n",pose); printf("%s\n",token); } fclose(pose); }

  • 配列とアドレス

    const char str1[5] = "aaaa"; const char* str2 = "aaaa"; printf("str1: %s %#x %#x \n", str1, str1, &str1); printf("str2: %s %#x %#x \n", str2, str2, &str2); 上記のプログラムにおいて、全く同じ結果が出力されるものと長年思っておりましたが 実際は以下のような結果となりました。 str1: aaaa 0x400794 0x400794 str2: aaaa 0x400794 0x6911faa0 str1は、なぜこのような結果になるのでしょうか。 str1はポインタ変数とは違うものなのでしょうか。 ご教授お願いします。 ※実行確認はこちらのサイトで行いました。 https://paiza.io/

  • 多元配列について(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でお願いします。 以上。よろしくお願いします。

  • 文字列で表現された時刻の変形

    文字列で表現された時刻の変形 13:23:23のような時刻を秒単位で表したいと思っています。そこで以下のように #include <stdio.h> int main() { char str[9]; int i; int j; scanf("%s",str); for(i=0;i<9;i++) printf("%c\n",str[i]); return 0; } 時刻を文字列の配列に置き換えることまでは考えつきましたが、この先に進めません。 どうしたらよいでしょうか?なお特別なライブラリなどは使用はできません。 よろしくお願い致します。

専門家に質問してみよう