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

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

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

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

Q&A

解決済

4回答

597閲覧

デリミタで区切った各単語を格納したい

rft3

総合スコア7

C

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

0グッド

0クリップ

投稿2020/07/01 16:42

sample.txtを読み込み、デリミタで区切った各単語を配列char **wordsの各要素に格納したいのですが、char.explode関数の中身がおそらく間違えていて実行できません。他の関数内も正直自信がなく手一杯です。どうかご教授お願いいたします。

sample.txtの中身↓

C

1Anyone who has never made a mistake has never tried anything new

実行コード↓

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4//#include <math.h> 5 6 7void read_text(char *fn, char *text){ 8 FILE *fp = fopen(fn, "r"); 9 fgets(text, 9999, fp); 10 fclose(fp); 11} 12 13int count_words(char *text, const char *delim){ 14char *p = NULL; 15for(int count = 0; ; count++){ 16p = strstr(text, delim); 17if(p == NULL) return count+1; 18text = p+1; 19 '\0' 20 } 21} 22 23char **explode(char *text, const char *delim){ 24 char *p = NULL; 25for(char explode = 0;explode++){ 26p = strstr(text, delim); 27if(p == NULL) return explode; 28text = p+1; 29 } 30} 31int main(int argc, char *argv[]){ 32 char *txt = (char *) calloc(10000, sizeof(char)); 33 read_text(argv[1], txt); 34 printf("入力文字列:%s", txt); 35 char *delim = argv[2]; 36 int num_of_words = count_words(txt, delim); 37 printf("単語数:%d\n", num_of_words); 38}

エラーメッセージ↓
cpgm/explode.c: In function ‘count_words’:
cpgm/explode.c:20:4: error: expected ‘;’ before ‘}’ token
}
^
cpgm/explode.c: In function ‘explode’:
cpgm/explode.c:25:32: error: expected ‘;’ before ‘)’ token
for(char explode = 0;explode++){
^
cpgm/explode.c:27:22: warning: return makes pointer from integer without a cast [-Wint-conversion]
if(p == NULL) return explode;


このような実行結果にしたい
./cpgm/explode data/sample.txt " "
入力文字列:Anyone who has never made a mistake has never tried anything new
単語数:12
1 Anyone
2 who
3 has
4 never
5 made
6 a
7 mistake
8 has
9 never
10 tried
11 anything
12 new

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

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

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

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

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

guest

回答4

0

ベストアンサー

デリミタが 1文字だけなら、strstr でなくて、strchr でいいでしょう。

C

1#include <stdio.h> // fopen, fclose, fgets, printf 2#include <string.h> // strchr 3 4int read_text(const char *fn, char *text) 5{ 6 FILE *fp = fopen(fn, "r"); 7 if (!fp || !fgets(text, 1000, fp)) return 1; 8 fclose(fp); 9 *strchr(text, '\n') = '\0'; // 改行文字を削除 10 return 0; 11} 12 13int explode(char *text, char **word, char delim) 14{ 15 int n = 0; char *p; 16 for (word[0] = text; p = strchr(word[n], delim); word[++n] = p) 17 *p++ = '\0'; 18 return n + 1; 19} 20 21int main(int argc, char *argv[]) 22{ 23 char text[1000], *word[500], *p; 24 if (argc != 3) return 1; 25 if (read_text(argv[1], text)) return 2; 26 int n = explode(text, word, argv[2][0]); 27 printf("入力文字列:%s\n" "単語数:%d\n", text, n); 28 for (int i = 0; i < n; i++) printf("%d %s\n", i+1, word[i]); 29}

追記

  • read_text の中に 1000 という値が書いてあるのはよくない。
  • 改行文字が無い場合を想定していない。
  • main で使用しない変数 p が宣言されている。

以上のような不具合を修正します。

C

1#include <stdio.h> // fopen, fclose, fgets, printf 2#include <string.h> // strchr 3 4int read_text(const char *fn, char *text, int n) 5{ 6 FILE *fp = fopen(fn, "r"); 7 if (!fp || !fgets(text, n, fp)) return 1; 8 fclose(fp); 9 char *p = strchr(text, '\n'); 10 if (p) *p = '\0'; 11 return 0; 12} 13 14int explode(char *text, char **word, char delim) 15{ 16 int n = 0; 17 for (char *p = text; p = strchr(word[n++] = p, delim); *p++ = '\0') ; 18 return n; 19} 20 21int main(int argc, char *argv[]) 22{ 23 char text[1000], *word[500]; 24 if (argc != 3) return 1; 25 if (read_text(argv[1], text, sizeof text)) return 2; 26 int n = explode(text, word, argv[2][0]); 27 printf("入力文字列:%s\n" "単語数:%d\n", text, n); 28 for (int i = 0; i < n; i++) printf("%d %s\n", i+1, word[i]); 29}

投稿2020/07/02 04:33

編集2020/07/02 05:54
kazuma-s

総合スコア8224

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

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

0

こんなことがやりたいのかな?

C

1#include <stdio.h> 2#include <string.h> 3 4int split(char* str, char* tokens[], const char* delim) { 5 int count = 0; 6 for ( char* token = strtok(str, delim); token; token = strtok(NULL, delim)) { 7 if ( tokens ) tokens[count] = token; 8 ++count; 9 } 10 return count; 11} 12 13int main() { 14 char input[] = "きょうは,とても,いい天気"; 15 char* tokens[10]; 16 int n = split(input, tokens, ","); 17 int i; 18 for ( i = 0; i < n; ++i ) { 19 printf("[%s] ", tokens[i]); 20 } 21 printf("\n"); 22 return 0; 23}

[追記] 少なからず小賢しい修正。第二引数:tokensにNULLを渡せば分割数が返ってくるので...:

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int split(char* str, char* tokens[], const char* delim) { 6 char* last = str + strlen(str); 7 int count = 0; 8 for ( char* token = strtok(str, delim); token; token = strtok(NULL, delim)) { 9 if ( tokens ) { tokens[count] = token; } 10 else { token[strlen(token)] = *delim; *last = '\0'; } 11 ++count; 12 } 13 return count; 14} 15 16int main() { 17 char input[] = "きょうは,とても,いい天気"; 18 char** tokens; 19 int n = split(input, NULL, ","); // token数を求め 20 tokens = malloc(sizeof(char*)*n); // そんだけの領域を確保して 21 split(input, tokens, ","); // もっかい呼ぶ 22 int i; 23 for ( i = 0; i < n; ++i ) { 24 printf("[%s] ", tokens[i]); 25 } 26 printf("\n"); 27 free(tokens); 28 return 0; 29}

投稿2020/07/02 00:34

編集2020/07/02 01:47
episteme

総合スコア16612

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

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

0

まずは、explode関数全体をコメント化して、main関数の中で単語に分解することに挑戦してください。それで、explode関数の呼び出しや返り値にまつわる問題を先送り(ここでは、問題を分割して後で解決するという意味)にできます。

投稿2020/07/02 00:00

Daregada

総合スコア11990

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

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

0

'\0'

これ、意味不明です

for(char explode = 0;explode++){

for文の構文になってません

if(p == NULL) return explode;

戻り値の型があってません。

基本的な文法をまずしっかりマスターする必要がありますねー
おはなしはそれから

投稿2020/07/01 22:22

編集2020/07/01 22:22
y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問