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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

565閲覧

C言語 文字列の配列について

mocamaru

総合スコア1

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/20 11:57

前提・実現したいこと

文字列中のある文字列を見つけて数えるプログラムを作りたいです。

(例)
文字列:This is a pen.
ある文字列:is
のとき、
isが3文字目、6文字目に見つかる

発生している問題・エラーメッセージ

無限ループになったり、14文字が見つかってしまいます。

該当のソースコード

C

1#include<stdio.h> 2#include<string.h> 3 4int main(void) { 5 6 char str[100]; 7 char str1[10]; 8 char str2[10]; 9 char ch; 10 printf("文字列を入力してください : "); 11 gets_s(str); 12 printf("調べたい英単語を入力してください : "); 13 gets_s(str1); 14 int count = 0; 15 int j = 0; 16 int s = 0; 17 int len = strlen(str1); 18 19 for (int i = 0; str[i] != '\0'; i++) { 20 for(j=0;str1[len-1];j++){ 21 if (str[i] == str1[j]) { 22 str2[s] = str1[j]; 23 s++; 24 } 25 printf("「%s」は. %d文字目に見つかりました!\n", str1, i + 1); 26 count++; 27 } 28 } 29 30 printf("「%s」は. 合計で%d文字. 見つかりました!\n", str1, count); 31 32 return 0; 33}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージ)

Visual Studio .cpp

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

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

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

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

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

episteme

2021/04/20 12:59

"aaaa" 中に "aa" は何回見つかると答えてほしいですか? 2回? それとも3回?
mocamaru

2021/04/20 13:10

前回投稿の仕方が間違えていて修正したのですが反映されなかったのでもう一度投稿させていただきました。 2回です
guest

回答2

0

質問のコードの ch や str2 は何のためにあるのですか?

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char str[100]; 6 char str1[10]; 7 printf("文字列を入力してください : "); 8 gets(str); 9 printf("調べたい英単語を入力してください : "); 10 gets(str1); 11 int count = 0; 12 for (int i = 0; str[i] != '\0'; i++) { 13 int j; 14 for (j = 0; str1[j] != '\0'; j++) // str1 の全部の文字と比較 15 if (str[i+j] != str1[j]) break; // 不一致ならループを出る 16 if (str1[j] == '\0') { // str1 と完全に一致したら 17 printf("「%s」は. %d文字目に見つかりました!\n", str1, i + 1); 18 count++; 19 i += j - 1; // str1 の長さの分だけ先に進める 20 } 21 } 22 printf("「%s」は. 合計で%d文字. 見つかりました!\n", str1, count); 23 return 0; 24}

投稿2021/04/20 16:50

kazuma-s

総合スコア8224

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

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

0

少なくとも、

C

1for(j=0;str1[len-1];j++){

ループ内でstr1[len-1]が変わることもなければ途中でbreakしたりもないので、ループは一度も実行されないか無限ループになるのかのどちらかです。

投稿2021/04/20 12:01

maisumakun

総合スコア145930

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

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

maisumakun

2021/04/20 12:03

元のコードが意図すら汲み取れない状況で、どこをどう修正していいかコメントできないです(まるごと書き直したほうがいいレベルだと考えました)。
pepperleaf

2021/04/20 12:04

多分、str1[len-1] == '\0'なので、一回も実行されないのでは?
maisumakun

2021/04/20 12:06

strlenに末端の\0の分は含まないので、末端の\0はstr1[len]にあるかと思います(となると、無限ループが確定ですね)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問