文字列の省略語を作って出力したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
gumi

文字列の省略語を作って出力したい

#1

投稿記事 by gumi » 7年前

例えば nippon hoso kyokaiという言葉をscanしたら、nhkと出力してくれるようなコードを書きたいと思っています。

そこで、試しに、入力した文字列を空白で区切り、配列化しようとしたのですが
ネットに転がっているコードをつぎはぎしたものなので、エラーが出るうえ、いまいち自分でも何をしているのかよくわかりません。
申し訳ありませんが、エラーの対処方法とコードの意味について教えていただけないでしょうか。

コード:

 
#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[])  /*お決まりの宣言で常に一緒??*/  
{
 int i = 0;  /*変数iを初期化する*/  
 char str[] = scanf("%s",str);  /*文字列を配列として受け取る*/  
 char *str[SIZE];  /* *が入っているので、文字列が置いてあるstrのアドレスのサイズを取得しに行っている?*/  
 
 str[i] = strtok(str, " ");   /*文字列をスペースで分割したときの、各要素の数字がstr[i]に入る??*/  
 
 while((i < SIZE) && (str[i] != NULL)){ 	/*iが文字列の配列サイズ以下で、かつ要素が空の時に限りループする*/
 argv[++i] = strtok(Null, " "); 	/*iがインクリメントされるたびに、何かを分割している??*/
 }
 printf("%s\n",str[]); 	/*ループが終わったので配列を出す*/
 return 0;
}

エラー文は、下の2つです。
①「‘for’ loop initial declarations are only allowed in C99 mode」
 for (int i = 0; i < argc; i++)」と出るのですがいまいちよくわからず(C99モードってなんだ)
②「expected expression before ‘]’ token
     printf("%s\n",str[]);」 
                       ^
 


次に、配列化したあと、さらに要素の文頭を指定して出力するにはどうしたらいいでしょうか?
イメージとしては、下です。
※str[0][0]→N とか??どうやってぐぐったらいいのかもわかりません・・・

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列の省略語を作って出力したい

#2

投稿記事 by みけCAT » 7年前

gumi さんが書きました:エラー文は、下の2つです。
①「‘for’ loop initial declarations are only allowed in C99 mode」
for (int i = 0; i < argc; i++)」と出るのですがいまいちよくわからず(C99モードってなんだ)
②「expected expression before ‘]’ token
printf("%s\n",str[]);」 
^
これは提示されているコードに対応するエラー文ではないですね。
提示されているコードにfor文は使われていない上、あってはいけない場所に全角スペースがある、
定義されていないSIZEやNullが使われているなどの問題があるので、もっと大量のエラーが出るはずです。
提示されているコードをWandboxでコンパイルすると、以下のエラー(や警告)が出ました。
► スポイラーを表示
ちなみに、C99モードはコンパイラが入力をどの言語仕様に従って解釈するかのモードであり、GCCであれば-std=c99オプションで利用できます。
gumi さんが書きました:次に、配列化したあと、さらに要素の文頭を指定して出力するにはどうしたらいいでしょうか?
そのようなコードを書いてコンパイルし、出力すればいいでしょう。

コード:

#include <stdio.h> /* scanfなどの入出力関数の宣言を取り込み、使えるようにする */
#include <string.h> /* strtokなどの文字列操作関数の宣言を取り込み、使えるようにする */

#define SIZE 10000 /* 受け入れる最大の文字数(改行や終端のナル文字を含む) */

int main(void) { /* エントリーポイント。今回はコマンドライン引数を受け取らない */
 int num = 0; /* 整数型の変数、0で初期化する */
 int i; /* 整数型の変数 */
 char str[SIZE]; /* 入力を入れる場所。文字を要素とするSIZE要素の配列 */
 /* 分割される単語は1文字以上と空白からなるので、少なくともSIZE-1個以下であるといえる */
 char *words[SIZE]; /* 単語の位置を入れる場所。文字(列)へのポインタを要素とするSIZE要素の配列 */
 /* ここに入るのは単語数と同じ数のデータ+終端なので、終端を含めるからといってSIZE+1要素確保する必要は無い */
 char result[SIZE]; /* 頭文字を結合した文字列を入れる場所。文字を要素とするSIZE要素の配列 */

 /* 入力の読み込み */
 str[0] = '\0'; /* 読み込めなかった場合に備えて初期化する */
 fgets(str, sizeof(str), stdin); /* 文字列を標準入力から最大でバッファいっぱいまで1行読み込む */

 /* 文字列の分割 */
 words[0] = strtok(str, " "); /* 文字列の空白での分割を開始する */
 while ((num < SIZE) && (words[num] != NULL)) { /* 容量が残っていて、単語が得られる間繰り返す */
  words[++num] = strtok(NULL, " "); /* 文字列の空白での分割を進める */
 }

 /* 得られた単語から先頭の文字を取り出す */
 for (i = 0; i < num; i++) {
  result[i] = words[i][0];
 }
 result[num] = '\0'; /* 終端文字を加えて文字列にする */

 /* 得られた文字列を出力する */
 puts(result);

 return 0; /* 正常終了する */
}
上のコードは提示されたコードに寄せて書きましたが、この場合はstrtokを使わなず、scanfの空白文字で分割してくれる機能を利用してもいいでしょう。

コード:

#include <stdio.h> /* scanfなどの入出力関数の宣言を取り込み、使えるようにする */

#define WORD_MAX_LEN 10000 /* 受け入れる最大の単語の文字数 */
#define WORD_MAX_LEN_STR "10000" /* 受け入れる最大の単語の文字数を表す文字列。上と同じにすること。 */

#define MAX_COUNT 10000 /* 受け入れる最大の単語数 */

int main(void) { /* エントリーポイント。今回はコマンドライン引数を受け取らない */
 int num = 0; /* 整数型の変数、0で初期化する */
 /* 終端文字用に最大の文字数+1要素確保する */
 char word[WORD_MAX_LEN + 1]; /* 入力を入れる場所。文字を要素とするWORD_MAX_LEN + 1要素の配列 */
 char result[MAX_COUNT + 1]; /* 頭文字を結合した文字列を入れる場所。文字を要素とするMAX_COUNT + 1要素の配列 */

 /* 要素に空きがあり、単語を読み込める間繰り返す */
 while (num < MAX_COUNT && scanf("%" WORD_MAX_LEN_STR "s", word) == 1) {
  result[num++] = word[0]; /* 結果の文字列に読み込んだ単語の最初の文字を追加する */
 }
 result[num] = '\0'; /* 終端文字を加えて文字列にする */

 /* 得られた文字列を出力する */
 puts(result);

 return 0; /* 正常終了する */
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 文字列の省略語を作って出力したい

#3

投稿記事 by かずま » 7年前

gumi さんが書きました:例えば nippon hoso kyokaiという言葉をscanしたら、nhkと出力してくれるようなコードを書きたいと思っています。

コード:

#include <stdio.h>

int main (void)
{
	for (int c, d = ' '; (c = getchar()) != EOF; d = c)
		if (d == ' ' || d == '\n' || c == '\n') putchar(c);
}
実行結果

コード:

nihon hoso kyokai
nhk
hyper text markup language
html
transport control protocol
tcp
central processing unit
cpu
^Z  (Linux の場合は Ctrl-D)

gumi

Re: 文字列の省略語を作って出力したい

#4

投稿記事 by gumi » 7年前

この度は誠に有難う御座います。
また、ご返信が遅れ申し訳ありません。
理解できてから返信しようと思っていたらこのような遅れに繋がってしまいました。

質問させていただく前に基礎を固めるべきだったと反省しています。

ただ、おかげさまで動くコードを書くことができました。

もし、また不明点がでてきた場合はお手数ですがお力をお借りできますと幸甚です。

何卒よろしくお願いいたします。

返信

“C言語何でも質問掲示板” へ戻る