ライブラリ関数のstrchr()を自分で作成したくて書いてみたんだがうまく動かない
どこをどうすればいいか教えてください
#include <stdio.h>
main() {
char text, c, *pc;
int i;
printf("文字列を入力してください");
scanf("%s", text);
printf("検索する文字列を1文字入力してください");
scanf("%c%*[^n]%*c", &c);
pc = &text;
while(*pc != '\0') {
pc++;
i++;
if (*pc == c)
printf("%cは前から%d番目に存在します\n", c, i);
return(0);
}
printf("存在しません\n");
}
こうすると二つ目のscanfが実行された後にenter押しても次に進まないです。
どうすればいいですか。
C言語 誰か教えて [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1仕様書無しさん
2015/06/16(火) 18:14:20.102015/06/16(火) 23:21:23.08
まず服を脱ぎます
3仕様書無しさん
2015/06/17(水) 01:09:15.97 脱がずにする方が好きです
2015/06/17(水) 02:48:09.40
入門読め
基本編ではCharは配列で宣言するはずだ
基本編ではCharは配列で宣言するはずだ
7仕様書無しさん
2015/06/20(土) 02:43:50.15 >>6
います
います
8片山博文MZ ◆T6xkBnTXz7B0
2015/06/20(土) 03:39:48.17 #include <stdio.h>
#include <string.h>
void chomp(char *s) {
size_t len = strlen(s);
if (len && s[len - 1] == '\n') s[len - 1] = 0;
}
char *my_strchr(char *s, char ch) {
while (*s) { if (*s == ch) return s;
++s;
} return NULL; }
int main(void) {
char ch, *pch, text[512]; int i;
printf("文字列を入力してください"); fgets(text, 512, stdin); chomp(text);
printf("検索する文字を入力してください"); scanf("%c", &ch);
pch = my_strchr(text, ch);
if (pch) { i = (int)(pch - text) + 1;
printf("%cは前から%d番目に存在します\n", ch, i); return 0;
}
puts("存在しません"); return 0; }
#include <string.h>
void chomp(char *s) {
size_t len = strlen(s);
if (len && s[len - 1] == '\n') s[len - 1] = 0;
}
char *my_strchr(char *s, char ch) {
while (*s) { if (*s == ch) return s;
++s;
} return NULL; }
int main(void) {
char ch, *pch, text[512]; int i;
printf("文字列を入力してください"); fgets(text, 512, stdin); chomp(text);
printf("検索する文字を入力してください"); scanf("%c", &ch);
pch = my_strchr(text, ch);
if (pch) { i = (int)(pch - text) + 1;
printf("%cは前から%d番目に存在します\n", ch, i); return 0;
}
puts("存在しません"); return 0; }
2015/06/20(土) 10:30:17.88
>>7
まず宣言のところは
char text[100] , c , *pc ;
int i = 1 ;
にする
textは文字型配列にする
ただのポインタに文字列入れても確保されてないメモリにデータ入って異常動作しかねない
iに初期値ないとi++;しても正常にカウントアップされない
ポインタの代入文はtext[100]で宣言してtextもcharのポインタになってるから
pc = text;
にする
whileループの条件文はそのまま
中は
pc++;
i++;
if(){}
にすると1文字目が飛ばされるから
if(){}
pc++;
i++;
にする
これで動くはず
まず宣言のところは
char text[100] , c , *pc ;
int i = 1 ;
にする
textは文字型配列にする
ただのポインタに文字列入れても確保されてないメモリにデータ入って異常動作しかねない
iに初期値ないとi++;しても正常にカウントアップされない
ポインタの代入文はtext[100]で宣言してtextもcharのポインタになってるから
pc = text;
にする
whileループの条件文はそのまま
中は
pc++;
i++;
if(){}
にすると1文字目が飛ばされるから
if(){}
pc++;
i++;
にする
これで動くはず
11仕様書無しさん
2015/06/20(土) 16:28:05.04 厶板でやれ
12仕様書無しさん
2015/06/20(土) 16:56:07.21 チンチンの皮をム板
13仕様書無しさん
2016/10/15(土) 04:46:14.0714仕様書無しさん
2016/10/15(土) 23:40:35.33 スタック破壊とchar*にはconst付けろというのは初心者には理解できないか
15仕様書無しさん
2016/10/19(水) 20:46:16.67 >>14
付けるとどんなメリットがあるんですか?
付けるとどんなメリットがあるんですか?
16仕様書無しさん
2016/10/19(水) 22:57:32.25 関数の引数としてconst char*またはchar const*となっていると、引数を見た人がこの関数内でポインタをデリファレンスした値が変更されないと理解できる
また、コンパイラにもそれを明示的に指示できるので最適化される可能性が高くなる
ちなみにchar *constの場合は、(デリファレンス前の)変数値が変更されないと理解できる
しかしながら、ポインタ変数のコピー渡しなので意味がないし、const char*とchar *constでは互換性がないため
strchr()を実装するという観点からはchar *constという宣言は不適切である
もちろんchar const*constという宣言も可能であることを付け加えておく
上記の性質より、char const*const*というようにポインタのポインタ変数を宣言する際に変数値を変更しないし、デリファレンスした変数値も変更しないというときに使うことになる
また、コンパイラにもそれを明示的に指示できるので最適化される可能性が高くなる
ちなみにchar *constの場合は、(デリファレンス前の)変数値が変更されないと理解できる
しかしながら、ポインタ変数のコピー渡しなので意味がないし、const char*とchar *constでは互換性がないため
strchr()を実装するという観点からはchar *constという宣言は不適切である
もちろんchar const*constという宣言も可能であることを付け加えておく
上記の性質より、char const*const*というようにポインタのポインタ変数を宣言する際に変数値を変更しないし、デリファレンスした変数値も変更しないというときに使うことになる
18仕様書無しさん
2016/10/21(金) 02:15:05.88 strchr(char *str){
for(n = 0; *str ; ++str) ++n;
return n;
}
for(n = 0; *str ; ++str) ++n;
return n;
}
19仕様書無しさん
2017/06/11(日) 15:31:12.19 嫌です
20仕様書無しさん
2017/12/29(金) 21:52:50.23 誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。
グーグル検索⇒『宮本のゴウリエセレレ』
3GUVEYI7D4
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。
グーグル検索⇒『宮本のゴウリエセレレ』
3GUVEYI7D4
21仕様書無しさん
2018/05/22(火) 13:22:49.63 とても簡単な自宅で稼げる方法
参考までに書いておきます
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
HGK39
参考までに書いておきます
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
HGK39
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【赤坂“サウナ火災”30代夫婦死亡】サウナストーンでドア割ろうとした可能性 非常ボタン作動しなかったか ★3 [ぐれ★]
- 【高市首相】「日本人が日本各地を旅行するのも大切」 中国からの渡航自粛巡り ★5 [ぐれ★]
- 統合中学の校名案「桜花」 特攻機名と重なり波紋 福岡・大牟田……「生徒が純真に考えた」と賛成意見も市民団体などが疑問の声 ★2 [少考さん★]
- 【赤坂サウナ死亡火災】別室でもドアノブがたつく 男性の手に皮下出血、ガラスたたいたか [ぐれ★]
- 日銀 政策金利0.75%に引き上げへ 賃上げ動向後押しに 30年ぶりの水準 金融政策決定会合 [ぐれ★]
- 【高市首相】「日本人が日本各地を旅行するのも大切」 中国からの渡航自粛巡り ★6 [ぐれ★]
- 赤坂蒸し焼きサウナ、「ようこおおおおおおおお!!!!」意識を失う寸前まで拳でガラスを割ろうとしていたと判明・・・ [329329848]
- 赤坂蒸し焼きサウナ、「とれたドアノブを取りつける」で扉が開いたと判明wwwwwwwwwwwwwwwwwwwwwwww🔥 [329329848]
- 【高市速報】山上徹也さん、厳しい刑が求刑される模様…🥺 [931948549]
- 高市早苗「パンダいらねぇよなぁ!?」国民「よく考えたらいらない」 [834922174]
- 【高市悲報】小泉の進さん、レーダー照射について触れなくなる🤔いったいなぜ… [359965264]
- 結婚しない方が幸せだよな
