ページ 1 / 1
saanf
Posted: 2017年7月12日(水) 03:27
by mac
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;
}
Re: saanf
Posted: 2017年7月12日(水) 03:36
by 元学生A
簡単にデバッグしてみました。
内容はコメントに記述したので、見てみてください。
コード:
#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;
}
オフトピック
インデントをしっかりとすると、コメントをもらいやすくなると思います。
Re: saanf
Posted: 2017年7月12日(水) 03:41
by mac
ありがとうございます
解決しました
Re: saanf
Posted: 2017年7月12日(水) 03:44
by 元学生A
すみません。
余分なコードともっとコードを良くするポイントを見つけたので修正版を上げます。
コード:
#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
Posted: 2017年7月12日(水) 07:25
by かずま
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個ありました。