小文字のみを表示させるプログラミングがいくらやってもできません。範囲指定をどこですれば良いのかわからず、全部の文字数をカウントしてしまいます。

ご指摘お願いします。


#include <stdio.h>
#include <string.h>
int main(void)
{
char str[256];
int a;
printf("大文字と小文字をランダムに入力\n");
gets(str);
printf("小文字の数は%dです\n",strlen(str),a);
return(0);
}

このQ&Aに関連する最新のQ&A

A 回答 (9件)

恐らく何かの課題なのだろうけど


単に文字数をカウントするのが目的の課題なら、islowerを使うのが早道でしょうし

文字コードという点に着目する課題であるなら、
if (('a' <= str[i]) && (str[i] <= 'z'))
という判定をする方が趣旨に添っているでしょうね。

課題であれば必ずその前段で課題の元になるであろうテーマが解説されているはずだから
質問者がそのテーマ解説を理解していないので、方針が定まらないのでしょうね。
    • good
    • 0

ちなみにアドバイスですけど、



「C 小文字 判定」でぐぐれば、すぐにislowerというのがヒットします。自分で調べる癖をつけておいたほうがよいですよ。
それと、ビルドエラーについてですが、解決できないなら、そのビルドエラーを貼り付けてみてください。
    • good
    • 0

No.4です。


えっと、プログラムを初めて作ってるレベルなのかな。
int a;の次の行に入れてもだめでしょう。
gets(str)で読み込んでいるんですよね?
したがって、gets(str)の次です。

コンパイルエラーについてですが、おそらく私が書いたのが間違っているかもしれません。これ、JavaならOKという例です。Cの記述になおしてください。
あと、No.6さんが教えてくださっているとおり、islowerというのを使うとよりきれいになります。
    • good
    • 0

幸いなことに、Cの標準関数にはislower()という、


「引数で指定した文字が英小文字かどうかを判定する」関数(もしくはマクロ)が
備わっています。
入力した文字列全体を1文字ずつ読んではislowerで判定させればよいです。
    • good
    • 0

「範囲指定」って何のことだろう.


それぞれの文字に対し「その文字が小文字だったら 1を加える」って書くだけなんだけどね. ある文字が小文字かどうかを判定する方法はわかってますか? 分からないと, 全くお話になりませんよ.
ってか, こんなのわざわざ gets 使うまでもなく getchar でいいじゃん.
指摘は以上.
構文も違うけど, それ以上に「小文字かどうか」をそんなふうに判定してはいけない>#4.
    • good
    • 0

センスないなあ。

いや冗談です。

Cの構文忘れたので間違っていたらごめんなさい。

int count = 0;
for (int i = 0; i < str.length; i++) {
if (('a' <= str[i]) && (str[i] <= 'z')) {
count++;
}
}

countにカウントされます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
今のを、int a;のところから入れても、ビルドの時にエラーが出てきてしまいます。
どこに入れたらいいのでしょうか?

申し訳ありませんが、よろしくお願いします。

お礼日時:2009/05/20 15:37

>gets(str);



この関数で、文字列として取得しますよね?
この文字列内には、大文字も小文字も混じっているのでしょう?
ヒョッとしたら、数字や記号も?

なので、文字列を1文字ずつに分解(というか切り出し)して
その一個の文字がどういったモノなのか?(大文字?小文字?数字?その他?)判断し
条件に一致するモノだけを、加算するなり、印字するなり・・・・

と言う風に、漠然と思考するのではなく一つ一つ物事を噛み砕いて考えましょう。
    • good
    • 0
この回答へのお礼

他の方法でやってみても、エラーが出てしまうので
漠然とした考えになってしまいました。
どこで、判断をすればいいのでしょうか?

お礼日時:2009/05/20 15:40

変数 a の用途は何ですか?

    • good
    • 0

小文字のみをカウントする関数を作らないとダメなのでは?

    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列中に含まれる文字の個数をカウントするプログラムについて…

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
cnt++;
str++;
}
return cnt;
}

int main()
{
const char *str="hello,world!";
const ch='o';

int cnt;

cnt=count(str, ch);

printf("%s中に%cは%d個です\n", str, ch, cnt);


return 0;
}

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
...続きを読む

Aベストアンサー

scanf"%s", str)は、バッファオーバーフローの危険と改行文字の食べ残し問題がありますね。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
int main()
{
char ch;
char str[BUFSIZ];
int cnt;

printf("文字列を入力して下さい > ");
fgets(str,BUFSIZ,stdin);

printf("カウントする文字を入力してください > ");
ch = getchar();

cnt=count(str, ch);
printf("%s中に%cは%d個です\n", str, ch, cnt);

return 0;
}

Qstrcat関数を自作したいです

失礼します。
私はC言語を勉強し始めて3週間の超初心者なのですが、今関数の勉強をしており、例題でstrcat関数を自作してみようと思っています。
 が、作り方が分からず、他のサイト、書物、質問なども参考にしてみましたが説明を読んでも理解できませんでした。

どなたかstrcat関数を初心者にも分かりやすいように自作例を作っていただけると大変幸いです。できるだけ簡単で分かりやすいコードなら助かります。

宜しくお願いいたします。

Aベストアンサー

> >const char * restrict s2
> の最初が「const」になっている理由は何でしょうか・・・?

第一の理由は、これがstrcatの仕様だからです。
第二の理由としては、コピー元の文字列は変更されることがないため、そのことを呼び出し元に保証するために付けています。

Q数字文字をカウントするプログラムの動作について

良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。
C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。

#include <stdio.h>

int main(void)
{
int i,ch;
int cnt[10] = {0};

while(1)
{
ch = getchar();
if (ch==EOF) break;

switch(ch)
{
case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */
case '1' : cnt[1]++;printf("%d\n",ch);break;
case '2' : cnt[2]++;printf("%d\n",ch);break;
case '3' : cnt[3]++;printf("%d\n",ch);break;
case '4' : cnt[4]++;printf("%d\n",ch);break;
case '5' : cnt[5]++;printf("%d\n",ch);break;
case '6' : cnt[6]++;printf("%d\n",ch);break;
case '7' : cnt[7]++;printf("%d\n",ch);break;
case '8' : cnt[8]++;printf("%d\n",ch);break;
case '9' : cnt[9]++;printf("%d\n",ch);break;
}
}

puts("数字文字の出現回数");
for(i=0;i<10;i++)
printf("'%d':%d\n",i,cnt[i]);
getchar();getchar();

return(0);
}

といったプログラムです。

実行し、数値を入力、CTRL+Zで入力を終了し、出現回数を表示させる、という動作自体は無事にできるのですが、何故chの値が変更していくのかがわかりません、数値を入力した時点で51や49といったそれぞれ違う数値が表示されるのですが、chの値を変更させる命令を、何が引き起こしているのかが理解できません、3(51)と判定されて同じ数が無限にカウントされないのは何故なのでしょうか・・・・?

また、その後の無限ループからの脱出をCTRL+Zがどうして引き起こすのかも理解できず困っています、教科書には「CTRL+Zは入力の終了を意味する」とあるのですが、これは一体どういう意味なのでしょうか、強制的に割り込んでEOFを代入するということなのでしょうか・・・?

お時間がある時にでも、教えて頂けると助かります、よろしくお願いします。

良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。
C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。

#include <stdio.h>

int main(void)
{
int i,ch;
int cnt[10] = {0};

while(1)
{
ch = getchar();
if (ch==EOF) break;

switch(ch)
{
case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */
case '1' : cnt[1]++;printf("%d\n",ch);b...続きを読む

Aベストアンサー

>getchar関数とは入力した文字を順番に3、.、1、4、と返す関数ということなのでしょうか・・?

基本的にはそれで合ってます。
ただ、'3'、'.'、'1'、'4'という文字そのものを返す訳ではなく、アスキーコードを返します。
http://e-words.jp/p/r-ascii.html

平たくいうと、コンピュータは0と1の世界ですから、'a'などの文字も数値としてハードディスクに保存する必要があります。人間が見て分かる文字とコンピュータの世界のコードとの対応表がアスキーコード表です。
OSを始め様々なソフトが、この保存された数値を人間が見て分かりやすい文字に変換してくれてるわけです。


今回の例で言うと、入力された数値をアスキーコードではなく、配列の添字として使いたいので、
int index = ch - '0';
としています。

int index = ch - 48;
でもいいんですが、マジックナンバー(プログラム中に書かれた0, 1以外の数値)を嫌う人もいますので、'0'としています。



printfで%dで出力すると、アスキーコードの値がそのまま出力されます。
これを入力した文字そのものを出力したい場合は、%cを使用します。

>getchar関数とは入力した文字を順番に3、.、1、4、と返す関数ということなのでしょうか・・?

基本的にはそれで合ってます。
ただ、'3'、'.'、'1'、'4'という文字そのものを返す訳ではなく、アスキーコードを返します。
http://e-words.jp/p/r-ascii.html

平たくいうと、コンピュータは0と1の世界ですから、'a'などの文字も数値としてハードディスクに保存する必要があります。人間が見て分かる文字とコンピュータの世界のコードとの対応表がアスキーコード表です。
OSを始め様々なソフトが、この保存された数...続きを読む


人気Q&Aランキング

おすすめ情報