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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

配列

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

Q&A

解決済

1回答

21747閲覧

入力された文字列を分割し、配列に文字列を代入

tento65

総合スコア11

C

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

配列

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

0グッド

0クリップ

投稿2017/06/04 11:19

###前提・実現したいこと
入力された文字列から複数の配列に文字列を入れたいです。
また、それを全て出力したいです。

abc,def,ghi

abc
def
ghi

###発生している問題・エラーメッセージ
ランタイムエラー

###該当のソースコード

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void){ char tmp[100]; int num; //出力数を入力 fgets(tmp, sizeof(tmp), stdin); num=atoi(tmp); char str[1000]; //文字列を入力 fgets(str, sizeof(str), stdin); char *words[2][20]={""}; //分割 words[0][0]=strtok(str,","); for(int i=0;i<num;i++){ words[i][0]=strtok(NULL,","); } int cnt=0; for(int i=0;i<num;i++){ while(1){ if(words[i][cnt]=="")break; printf("%c",*words[i][cnt]); cnt++; } printf("\n"); } return 0; }

###試したこと
一次元配列だと一文字しか入らないため、二次元配列にしました。
words[i][]のような形にしましたが、やはり入りませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
C言語
paiza.io

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

strtok の挙動がイメージできていないようですね。 strtok は入力された配列、つまり今回の例で言えば str を書き換えます。 カンマを見つけた箇所を文字終端 ('\0') に置き換えた上で、区切られた文字の先頭を指すポインタを返すのです。

なので、結果を保存する配列は文字列を保存する配列ではなく、ポインタを格納する変数を用意しなければならないのです。 メモリの構造を思い浮かべられるかどうかは C を使う上での基本なので、これはもう練習を重ねてくださいとしか言えないのですが、 C の理屈を理解できれば自然に理解できるはずです。

これらを踏まえて記事中のコードを書き換えるならこういう要領になると思います。

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void){ char tmp[100]; //出力数を入力 fgets(tmp, sizeof(tmp), stdin); int num = atoi(tmp); char str[1000]; //文字列を入力 fgets(str, sizeof(str), stdin); char **words = malloc(sizeof(char*)*num); //分割 words[0]=strtok(str,","); for(int i=1;i<num;i++) words[i]=strtok(NULL,","); for(int i=0;i<num;i++) printf("%s\n", words[i]); free(words); return 0; }

投稿2017/06/04 14:27

編集2017/06/04 14:29
SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tento65

2017/06/06 05:29

この短い変更でも曖昧な部分があるのでお聞きしたいことがあります。 mallocの中身でcharポインタ型の*numとありますが、ポインタを扱ってnumを取り出しに行っている、もしくは型のサイズ×numとしてサイズ取得しているのでしょうか? mallocを調べたところ、恐らく後者だと思うのですがポインタの知識がないので確信が持てませんでした。
SaitoAtsushi

2017/06/06 07:04

後者です。 `malloc` にはバイト数を指定して呼び出します。
tento65

2017/06/07 03:42

初歩的な質問へのご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問