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

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

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

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

Q&A

解決済

2回答

1657閲覧

コンマで区切られた単語の文字列から見つけたい単語を出力する

wanwanko

総合スコア14

C

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

0グッド

0クリップ

投稿2021/12/08 09:24

現在、
コンマで区切られた単語の文字列を入力した後、一つ単語を入力して入力した文字列の中にあったらその単語の一文字目のアルファベットとそのアルファベットの中で何番目かを出力する,もし単語が文字列の中になければNOT FOUNDと出力するという問題に挑戦しています。
例えば
hello,my,new,classmate,class,heep,help
と入力してその後、
hello
と入力して、もしhello,my,new,classmate,class,heep,helpの文字列内にあったら
最初にHと出力
そしてその後、helloは、最初の文字はhなので、文字列内の最初の文字がhの単語の中で辞書順で考えて何番目か確認してその数字を出力
helloは最初の文字がhの単語の中で辞書順に考えるとheep,hello,helpと2番目なので
Hと出力した後、続けて2と出力する

入力例
hello,my,new,classmate,class,heep,help
hello
出力例
H 2

文字列を入力して「hello」と入力した後、Hと出力されるところまではかけたのですが、
上記の出力例のようなコードが上手く書けません。
他の単語を入力しても全てNOT FOUNDしか出力されません。
コードが完成したわけではないですが、このコードをどう直せばいいのかご教示いただけると幸いです。```

C

1#include <stdio.h> 2#include <string.h> 3#include <ctype.h> 4void demo(const char* str1, const char* str2) 5{ 6 char intial; 7 if (strcmp(str1, str2) == 0){ 8 intial=str1[0]; 9 putchar(toupper(intial)); 10 printf("\n"); 11 } 12 else 13 printf("NOT FOUND\n"); 14 15} 16 17int main(void) { 18 char str[1000],strn[1000]; 19 char *ptr; 20 21 scanf("%s",str);// カンマを区切りに文字列を分割 22 23 ptr = strtok(str, ","); 24 while(scanf("%s",strn)!=EOF){ 25 demo(strn,ptr); 26 } 27 28 return 0; 29}

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

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

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

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

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

dodox86

2021/12/08 09:32

> コードが完成したわけではないですが、このコードをどう直せばいいのか ご自身ではもうお手上げ、ということでしょうか。そうであるとほとんど丸投げです。現状のコードを理解して書いていますか。
wanwanko

2021/12/12 02:44

正直お手上げでした、ですが休憩した後書いてみたら上手く行きました、 丸投げみたいな質問してしまい申し訳ありません。次は質問する前に自分で休憩入れたいと思います。
guest

回答2

0

まず、 strtok(str,",") は「 str の全てを "," で分割してくれる」コードではありません。そこから分かっていないと後続のコードの意味がありません。
まずは strtok の使い方から学ばれては如何でしょうか。

投稿2021/12/08 10:12

jimbe

総合スコア13209

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

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

wanwanko

2021/12/12 02:41

使い方はわかりました????自分で情報集める努力します泣 ありがとうございました。
guest

0

ベストアンサー

strtok の使い方です。

#include <stdio.h> // puts #include <string.h> // strtok int main(void) { char s[] = "hello,my,new,classmate,class,heep,help"; char *p[100]; int n = 0; p[n] = strtok(s, ","); while (p[n] != NULL) { if (++n == 100) { puts("too many words"); return 1; } p[n] = strtok(NULL, ","); } for (int i = 0; i < n; i++) puts(p[i]); }

これが理解できないと先へは進めません。
最初の文字が同じものの中で何番目かを求める以前の問題です。

追記
strtok が理解できなくても先に進むことはできます。
',' を区切り文字として単語に分割するだけなので、
文字列を先頭から順に見ていけばよいのです。

C

1#include <stdio.h> // puts 2 3int main(void) 4{ 5 char str[] = "hello,my,new,classmate,class,heep,help"; 6 char *word[100]; 7 int n = 0; 8 9 word[n++] = str; 10 for (int i = 0; str[i]; i++) 11 if (str[i] == ',') { 12 str[i] = '\0'; 13 if (n == 100) { puts("too many words"); return 1; } 14 word[n++] = &str[i+1]; 15 } 16 for (int i = 0; i < n; i++) puts(word[i]); 17}

この配列 word をソートした後に、文字列を検索すればよいのです。

C

1#include <stdio.h> // scanf 2#include <string.h> // strcmp 3 4int main(void) 5{ 6 char *word[] = { "class", "classmate", "heep", "hello", "help", "my", "new" }; 7 int n = sizeof(word)/sizeof(word[0]), i, j; 8 char str[100]; 9 while (scanf("%99s", str) == 1) { 10 for (i = 0; i < n && strcmp(word[i], str); i++) ; 11 if (i == n) puts("NOT FOUND"); 12 else { 13 for (j = i; --j >= 0 && word[j][0] == word[i][0]; ) ; 14 printf("%c %d\n", word[i][0], i - j); 15 } 16 } 17}

投稿2021/12/10 03:40

編集2021/12/11 14:45
kazuma-s

総合スコア8224

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

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

wanwanko

2021/12/12 02:38

詳しくコードを書いてくださりありがとうございます
wanwanko

2021/12/12 02:39

このコードを理解して進歩できるようしっかり思考します????
wanwanko

2021/12/12 02:39

本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問