🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Q&A

解決済

3回答

1238閲覧

C言語での文字列探索のプログラムについて

kater

総合スコア7

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

0グッド

0クリップ

投稿2020/12/18 09:41

前提・実現したいこと

文字列の中に、指定した文字が何回出るかを出力するプログラムはかけたのですが、
文字列の中に、指定した文字列が何回出るかを出力するプログラムがかけなくて困っています。考え方を教えてください。

問題
1行目で文字列 s、2行目で文字列 t が入力されます。
s が t の中で何回出現するかカウントして出力してください。

入力される値
s
t
入力値最終行の末尾に改行が1つ入ります。文字列は標準入力から渡されます。

期待する出力
出現回数を1行で出力してください。
最後は改行し、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。
1 ≦ (文字列 s の長さ) ≦ 10,000
1 ≦ (文字列 t の長さ) ≦ 10,000
文字列 s, t は、半角アルファベットで構成された文字列

入力例1
AA
abdeeAAbAAAbfde

出力例1
3

試したこと(文字探索のプログラム)

#include <stdio.h> #include <string.h> int main(void){ char a; char buf[1000]; scanf("%c\n",&a); scanf("%s\n",buf); int cnt=0; size_t len; len = strlen(buf); for(int i=0;i<len;i++){ if(buf[i]==a){ cnt++; } } printf("%d\n",cnt); return 0; }

試したこと(文字列探索のプログラム)

#include <stdio.h> #include <string.h> int main(void){ char buf[1000]; char str[1000]; scanf("%s\n",str); scanf("%s\n",buf); int cnt=0; int cnt_=0; size_t len=0; size_t len_=0; len = strlen(buf); len_ = strlen(str); //この部分はわかりませんでした printf("%d\n",cnt_); }

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

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

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

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

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

tatsu99

2020/12/18 09:52

strstr という関数を使えば簡単ですが、それは反則ですか。
kater

2020/12/18 10:23

いえ、どんな回答でも助かります。
guest

回答3

0

作成したら締め切られていましたが、投稿します。
buff,strは10000文字なので、そのサイズ分確保しています。
strstrが使用禁止の場合は、strstrを自前で作成し(mystrstr)、それを呼び出せば良いです。
mystrstrの作成方法について、興味があればその旨、補足してください。

C

1#include <stdio.h> 2#include <string.h> 3int main(void){ 4 char buf[10000+1]; 5 char str[10000+1]; 6 char *p; 7 scanf("%s%*c",str); 8 scanf("%s%*c",buf); 9 int cnt=0; 10 p = buf; 11 while(1){ 12 p = strstr(p,str); 13 if (p == NULL) break; 14 cnt++; 15 p++; 16 } 17 //この部分はわかりませんでした 18 printf("%d\n",cnt); 19} 20

投稿2020/12/18 12:20

tatsu99

総合スコア5493

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

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

kater

2020/12/18 13:20

配列確保がまちがっていました!気をつけます。以下プログラム全体について自分なりにまとめてみました。一読していただけると幸いです。まず配列、変数の宣言の後scanfで標準入力から受け取ります。このとき*で文字は受け取らないようにする。(←バグの備えでしょうか?)ポインタ変数にbuf配列の先頭を指させ、この状態から常に正のループを回す。pにbufの中で最初に見つけたstrの先頭を指させ、指してなかったらbreakどこか指していたらcntに1を足し、先にポインタ変数pが指していたbufのとあるアドレスから1すすめ、またstrがないか探す・・・といった感じであってますか?
tatsu99

2020/12/18 13:31

>このとき*で文字は受け取らないようにする。(←バグの備えでしょうか?) 改行の読み飛ばしです。あなたの以下のscanfで、実際に動かすとわかりますが、何回かEnterキーを 押下しないと次に進めません。 scanf("%s\n",str); scanf("%s\n",buf); 上記以外はあっています。
guest

0

ベストアンサー

考え方を教えてください。

自分が目視で(あるいは紙とペンで)どうやって数えるかを考えてみればよいのではないでしょうか.

入力例1
AA
abdeeAAbAAAbfde

を例にすれば,私なら…

  • まずは "abdeeAAbAAAbfde" の先頭2文字(探す文字列"AA"の長さ分)を見る.

"ab"である.これは"AA"ではない.

  • 次の位置を見る."bd" である.これも"AA"ではない.
  • 次の位置を…

と,最後まで見て行って,"AA"だった個数をカウントします.

投稿2020/12/18 09:57

編集2020/12/18 09:58
fana

総合スコア11987

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

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

0

if(buf[i]==a){

int l = strlen(buf[i]) <= strlen(str) ? strlen(buf[i]) : strlen(str);
if(!strncmp(buf[i],str,l)){
に変えれば、行けると思います。

投稿2020/12/18 09:50

編集2020/12/18 13:19
otn

総合スコア85890

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問