saanf

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mac

saanf

#1

投稿記事 by mac » 6年前

C言語の問題です。文字列sの中に文字cが含まれているか探索する関数chumを作成しました。
恐らくですが、文字cのscanfが上手く動作していないために、思うように動作してくれません。
ご教授お願いいたします。

コード:


#include<stdio.h>
#include<string.h>
#define N 120

void chum(char *s,int c){
int count=0;//カウント
while(*s!='\0'){
s++;
if(*s==c){
count+=1;
}
printf("%d\n",count);
}
}

int main(void){
char s[N]={"123456"};
int c;
puts("探索文字cを入力");
scanf("%d",&c);
printf("c:%d",c);//何故かここでcが正しく表示されない
chum(s,c);
return 0;
}


元学生A

Re: saanf

#2

投稿記事 by 元学生A » 6年前

簡単にデバッグしてみました。

内容はコメントに記述したので、見てみてください。

コード:

#include<stdio.h>
#include<string.h>
#define N 120
 
void chum(char *s,int c){
    int count=0;//カウント
    while(*s!='\0'){
        // 1. チェックをしてから、s++する。順番が逆だと先頭の文字がチェックされない
        // 2. *sの値は文字コードを表す数値。例えば'0' = 48, '1' = 49, '2' = 50……。よって数字と比較するには'0'を引く必要がある
        if(*s - '0' == c){ 
            count+=1;
        }
        s++;
        printf("%d\n",count);
    }
}
 
int main(void){
    printf("%d\n", '0');
    char s[N]={"123456"};
    int c;
    puts("探索文字cを入力");
    scanf("%d",&c);
    printf("c:%d\n",c); //何故かここでcが正しく表示されない → 正しく表示されているが、\n(改行)が無く、この後の出力とつながって見えるので、正しく出力されているように見えない。
    chum(s,c);
    return 0;
}
オフトピック
インデントをしっかりとすると、コメントをもらいやすくなると思います。

mac

Re: saanf

#3

投稿記事 by mac » 6年前

ありがとうございます

解決しました

元学生A

Re: saanf

#4

投稿記事 by 元学生A » 6年前

すみません。
余分なコードともっとコードを良くするポイントを見つけたので修正版を上げます。

コード:

#include<stdio.h>
#define N 120
 
void chum(char *s,int c){
    int count=0;//カウント
    while(*s!='\0'){
        // 1. チェックをしてから、s++する。順番が逆だと先頭の文字がチェックされない
        // 2. *sの値は文字コードを表す数値。例えば'0' = 48, '1' = 49, '2' = 50……。よって数字と比較するには'0'を引く必要がある
        if(*s - '0' == c){ 
            count+=1;
        }
        s++;
        printf("%d\n",count);
    }
}
 
int main(void){
    char s[N] = "123456"; // 3. この場合、{}はいらない。ちなみに、Nを省略すると、コンパイラが文字数をカウントしてくれるので便利
    int c;
    puts("探索文字cを入力");
    scanf("%d",&c);
    printf("c:%d\n",c); //何故かここでcが正しく表示されない → 正しく表示されているが、\n(改行)が無く、この後の出力とつながって見えるので、正しく出力されているように見えない。
    chum(s,c);
    return 0;
}
C言語の学習、頑張ってください。

かずま

Re: saanf

#5

投稿記事 by かずま » 6年前

mac さんが書きました:解決しました
次のような実行結果で、本当に解決ですか?

コード:

探索文字cを入力
3
c:3
0
0
1
1
1
1
文字列 s は、数字だけの列なんですか?

私なら次のようにします。

コード:

#include <stdio.h>
 
void chum(const char *s, int c)
{
    int count = 0;
	for (int i = 0; s[i]; i++) {
		if (s[i] == c) {
			printf(" %d", i);
			count++;
		}
	}
	printf(": count = %d\n", count);
}
 
int main(void)
{
    char c, s[] = "123456abc4321";
    puts("探索文字cを入力");
    scanf(" %c", &c);
	printf("s: %s\n", s);
    printf("c: %c\n", c);
    chum(s, c);
    return 0;
}
実行結果

コード:

探索文字cを入力
3
s: 123456abc4321
c: 3
 2 10: count = 2
c は、文字列 s の中の 2番目と10番目にあり、全部で 2個ありました。

実行結果その2

コード:

探索文字cを入力
b
s: 123456abc4321
c: b
 7: count = 1
c は、文字列 s の中の 7番目にあり、全部で 1個ありました。

返信

“C言語何でも質問掲示板” へ戻る