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

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

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

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

Q&A

解決済

3回答

2482閲覧

文字列から任意の文字数を数えたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/10/31 15:19

c

1#include <stdio.h> 2 3int main(void) { 4 int i,count=0; 5 char str[10],n; 6 printf("文字列を入力してください\n"); 7 scanf("%s",str); 8 printf("検索したい文字を入力してください\n"); 9 scanf("%c",n); 10 11 printf("input string: %s\n", str); 12 13 for(i = 0; i < sizeof(str); i++) { 14 printf("str[%d] -> % c\n", i + 1, str[i]); 15 } 16 for(i=0;str[i]!='\0';i++) 17{ 18if(str[i]==n) 19{ 20count++; 21} 22} 23 24printf("%c:%d\n",n,count); 25 26return 0; 27} 28 29 30```### 前提・実現したいこと 3110個の配列要素を出力し、任意の文字を数えるプログラムを作成しようとしてます。 32 33 34### 発生している問題 35上記のプログラムを実行した際、検索したい文字を入力するところで終わってしまいます。 36配列要素を表示するのみのプログラムではうまく表示されるのですが、文字数を数えるプログラムを足すとうまくいきません。 37改善策を教えていただきたいです。

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

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

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

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

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

guest

回答3

0

上級者で無い限り、端末からの入力にscanfを使わない方が良いです。

他のおかしい点も直しました。

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void) { 5 int i,count=0; 6 char str[10]; 7 int n; 8 9 printf("文字列を入力してください\n"); 10 fgets(str, sizeof str, stdin); 11 if(str[strlen(str)-1]!='\n'){ 12 printf("文字列が長すぎます\n"); 13 return 1; 14 } 15 16 printf("検索したい文字を入力してください\n"); 17 n = getchar(); 18 19 printf("input string: %s\n", str); 20 21 for(i = 0; str[i]!='\0'; i++) { 22 printf("str[%d] -> % c\n", i + 1, str[i]); 23 if(str[i]==n) { 24 count++; 25 } 26 } 27 28 printf("%c:%d\n",n,count); 29 30 return 0; 31}

投稿2018/10/31 15:57

otn

総合スコア84505

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

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

0

ベストアンサー

c

1scanf("%c",n);

ここが間違っています。正しくは

c

1scanf("%c",&n);

です。もっともこの場合getcharで十分ですが。

あとはscanfの使い方がセキュリティ的によろしくないのと、文字列を一文字づつ表示させている部分がsizeofを使ってしまっている以外は特に問題ないかと思います。

c

1#include <stdio.h> 2#include <string.h> 3#include <stdint.h> 4#include <inttypes.h> 5int main(void) { 6 char str[11]; 7 printf("文字列を入力してください\n"); 8 if(NULL == fgets(str, 11, stdin)) return 1; 9 const size_t str_len = strlen(str) - 1; 10 str[str_len] = '\0';//erase LF 11 printf("検索したい文字を入力してください\n"); 12 const char n = getchar(); 13 14 printf("input string: %s, search: %c\n", str, n); 15 16 for(uint64_t i = 0; i < str_len; i++) { 17 printf("str[%" PRIu64 "] -> %c\n", i + 1, str[i]); 18 } 19 uint64_t count = 0; 20 for(size_t i=0;str[i]!='\0';i++) { 21 if(str[i]==n) { 22 count++; 23 } 24 } 25 26 printf("%c:%" PRIu64 "\n",n,count); 27 28 return 0; 29}

https://wandbox.org/permlink/2BXX7v0TvZo53A5L

投稿2018/10/31 15:40

yumetodo

総合スコア5850

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

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

0

文字列を入力する際、バッファに改行文字が残ってしまうのが原因です。
次のように書けば、改行文字を捨てることができます。

C

1printf("文字列を入力してください\n"); 2scanf("%s%*c", str);

また、次の部分もおかしいです。
scanf関数の第二引数以降は、アドレスでなくてはいけません。ここでは&nを渡してください。

C

scanf("%c",n);

scanf を捨て、fgets を利用するのも賢明です。とりわけ文字列を捌く場合は。


ついでに。この箇所も変ですね。

C

for(i = 0; i < sizeof(str); i++) {

sizeof ではなく strlen を使うべき場面かと。

投稿2018/10/31 15:28

編集2018/10/31 15:39
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問