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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1382閲覧

文字列が分割できない

L4zy

総合スコア18

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/04/29 00:52

入力した文字列を空白ごとに、分けて表示したいのですが、表示してくれません。
何が原因なのでしょうか?

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5void spacePart(char str[], char **num); 6// ハッシュ探索を行う関数 引数:なし 戻り値:0 7int main() 8{ 9 char str[1000]; 10 char *num[100]; 11 puts("100個以内の数値を入力してください。"); 12 gets(str); 13 // 文字列を空白ごと分ける 14 spacePart(str, num); 15 return 0; 16} 17 18// 文字列を空白ごとに分けて配列に格納する関数 引数:入力値、配列 戻り値:なし 19void spacePart(char str[], char **num) 20{ 21 // 空白区切りに文字列を分割 22 strcpy(num[0], strtok(str, " ")); 23 for(int i = 0; num[i] != NULL; i++) 24 { 25 strcpy(num[i], strtok(NULL, ",")); 26 printf("%s ", num[i]); 27 } 28} 29

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

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

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

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

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

guest

回答2

0

ベストアンサー

色々と問題点ありですね。
まず、

入力した文字列を空白ごとに

ですが、for()の中は、strtok(NULL, ",") これは、カンマ(,)での区切りです。

次に、文字列を格納しようとする領域 char *num[100] これでは、100個分の文字列ポインタしか確保されません。 char num[100][100]とすべきでしょう。 (これに合わせて、関数の呼び出しも変更する)

次は、for()の中のコピー strcpy(num[i], strtok(NULL, ",")) カンマ区切りの他にも問題ありで、文字列が無かった場合の strtok() の戻りが NULLなので、strcpy() の引数としては不適切。

C

1 char *next = strtok(NULL, " "); 2 if (next == NULL) break; 3 strcpy(num[i], next):

あたりか?
当然、for(int i = 0; num[i] != NULL; i++) の2番目も NG。無くてもよいかも。 --> for(int i = 1; ; i++)
また、最初の i = 0 これだと、最初の文字列が消えます。必要なら、i = 1

こんなところ? なお、細かなエラーチェックは、全て無視してます。

投稿2020/04/29 01:45

pepperleaf

総合スコア6383

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

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

0

strcpy(num[0], strtok(str, " "));のようなことをやっていますが、実際に渡したものはchar *num[100]で、ポインタ分の領域しかありません

文字列を入れる領域を適宜確保するか、strtokの返り値そのものを代入するかしてください。

投稿2020/04/29 00:58

maisumakun

総合スコア145201

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問