人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語の問題ですがわからないのでお聞きします。

アルファベットを入力させ、ある英文(文字列)の中に入力したアルファベットが何文字あるか調べるプログラムです。ポインタを使わなければなりません。英文は最初から用意されており、何でもいいのですが仮に「 He associate with a stone 」とします。

実行結果のイメージとしては

数を調べたいアルファベットを入力してください > s
「He associate with a stone 」という英文の中には s が 3 文字あります。

といった具合です。
ポインタの理解も曖昧なのですが、アルファベットをカウントする方法もよく分かりません。回答をよろしくお願いします。


●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

#include <stdio.h>
#include <string.h>
void main() {
char x ='s';
char str[]={"abcssttyyjjkk"};
int ix,len,cnt;
len = strlen(str);
for(ix=0,cnt=0; ix<len; ix++) {
if (str[ix]==x) { cnt++;}
}
printf ("%d",cnt);


}


2 ● 匿名回答2号
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>

static bool read_from_stdin(char* buffer, const size_t size)
{
 char* result;
 int index = 0;

 if (size <= 0) {
 return false;
 }

 result = fgets(buffer, size, stdin);

 if (result == NULL) {
 buffer[index] = '\0';
 return false;
 }

 index = strlen(buffer) - 1;
 if (buffer[index] == '\n') {
 buffer[index] = '\0';
 }

 return result != NULL;
}

static bool read_sentence(char* sentence, const size_t size)
{
 printf("英文を入力してください:\n");
 return read_from_stdin(sentence, size);
}

static bool read_word(char* word, const size_t size)
{
 printf("数を調べたいアルファベットを入力してください: \n");
 return read_from_stdin(word, size);
}

static int count_needle(const char* haystack, const char* needle)
{
 char* found;
 int result = 0;

 if (strlen(needle) == 0) {
 return 0;
 }

 found = strstr(haystack, needle);

 while (found != NULL) {
 found = strstr(found + strlen(needle), needle);
 ++result;
 }

 return result;
}

static void print_result(const char* sentence, const char* word)
{
 const int count = count_needle(sentence, word);
 printf("「%s」という英文の中には %s%d 文字あります。", sentence, word, count);
}

int main(int argc, char const* argv[])
{
 const size_t BUFFER_SIZE = 1024;
 char sentence[BUFFER_SIZE];
 char word[BUFFER_SIZE];

 if (!read_sentence(sentence, BUFFER_SIZE)) {
 printf("英文の読み込みに失敗しました。");
 exit(-1);
 }

 if (!read_word(word, BUFFER_SIZE)) {
 printf("文字の読み込みに失敗しました。");
 exit(-1);
 }

 print_result(sentence, word);

 return 0;
}

$ gcc -g -Wall -std=c99 -o main main.c
$ ./main
英文を入力してください:
He associate with a stone
数を調べたいアルファベットを入力してください:
s
「He associate with a stone」という英文の中には s が 3 文字あります。

3 ● 匿名回答3号

2号さん気合入ってるの回答したなw
でも学校の課題か何かだと思うので、
質問にあるように文字列の入力は考慮しなくていいだろうし、
エラー処理なんかも不要な気がしないでもない。



キーボードから文字を1文字取得する関数
getchar()
http://www9.plala.or.jp/sgwr-t/c/sec08.html



C言語っていうのは実に自由度の高い記述が可能なプログラム言語で、
文字列はそれ自体が配列として扱えます。
だからこの問題の場合、ポインタなんて使わなくても、
1号さんの方法のように配列のみでも正解が得らちゃうんですね。

str[0]には1文字目の"a"が
str[1]には2文字目の"b"が
str[2]には3文字目の"c"が

という具合にデータが格納されているので、
文字数分ループさせて1文字ずつ比較すれば、
何文字含まれているのかを求められるわけです。
あるいは、文字列の最後は"\0"なので、文字数はあえて調べず、
ループの終了条件を"\0"が出てくるまでとする事によっても
同じ結果を得られるでしょう。
どちらの方法を使うかは、過去に教わった内容次第という事です。



ポインタというのはメモリ上のアドレスを指定する方法です。
詳しい概要なんかはここから順に読んでいけばなんとなく理解できると思うけど、
http://www9.plala.or.jp/sgwr-t/c/sec10.html

一応説明すると、文字列を扱うポインタなので宣言も文字型で行って、

char *p;

p = &str;

とした時に、pにはstrのアドレスが代入されます。
すると何ができるようになるのか。

*p[0] と書けばstr[0]と記述した時と同じ動作をします。
*p[1] と書けばstr[1]と記述した時と同じ動作をします。

これだけでは単に記述が面倒になっただけで芸がないわけですが、
pを別の変数のアドレスで上書きすれば、
プログラムを書き換える事無く、複数の変数を扱う事ができるわけです。
具体的には、関数の呼び出しパラメータにポインタを指定して、
アドレスの受け渡しをするような使い方になると思いますよ。
あとはちょっと邪道な使い方として、

p++;

みたいにアドレスを直接いじる事もできちゃうんです。
そうすると配列で指定する必要すら無くなるんだったかな。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ