質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

885閲覧

C言語 ポインタを返す関数について

soboro

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/08/17 03:33

前提・実現したいこと

文字列の中に特定の文字cが含まれていれば、そのポインタを返す関数

 

発生している問題・エラーメッセージ

異なるconst修飾子です

該当のソースコード

C言語

#include <stdio.h> char *str_chr(const char *s, int c) { while (*s) {  if (c == *s)   return s;  *s++; } return NULL; } int main(void) { char s[128]; int c; printf("kye:"); c = getchar(); printf("文字列入力:"); scanf_s("%s",s,128); printf("%s\n",str_chr(s, c)); return 0; }
### 試したこと constを外せばうまくいったんですが、constありではどうすればいいのでしょう ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

解決済みですが、気づいたことがあるので。

*s++; という行があります。これは間違いです。
s++; とすべきです。

なぜなら、ここで行うのはアドレスを前に進める(アドレスを+1する)ことであって、そのアドレスのメモリを読むことでは無いから。なので、参照演算子「*」は不要です。

同じ間違いを良く見ます。エラーではないし、警告レベルを上げない限りコンパイラは警告も出さないようですが、場合によっては動作時に不具合を起こす可能性も考えられます。何よりもこの区別が曖昧だと、ポインタ変数とは何かがあやふやになってポインタが苦手になる・・・と私は見ています。

投稿2018/08/17 06:53

rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soboro

2018/08/17 15:00

*はポインタの指す中身にアクセスするから*は不要ということですね。 s++;は格納されていたアドレス値を1つ後ろに書き換えるという認識であっているでしょうか?
rubato6809

2018/08/17 15:12

> s++;は格納されていたアドレス値を1つ後ろに 「後ろ」って具体的にどういうことですか? 後置インクリメントの「後」なら混乱してますよ。 s++ はポインタ変数の値をひとつ分増やします。s は char*型のポインタだから、アドレスがひとつ増えます。たとえば、1000番地を指していたら、1001番地を指すようになる。それを私は「アドレスを前に進める」と書きました。
rubato6809

2018/08/17 15:15

念の為。この場合、前置インクリメントの ++s も、後置インクリメントの s++ でも、どちらでも結果は同じ、 s の値がひとつ増えます。 s = s + 1; でも s += 1; でも、結果はみな同じ。
soboro

2018/08/19 08:38

紛らわしい言い方をしてすいません。+1されるという意味でした(0からみて後ろ)。 間違いをご指摘いただきありがとうございました。
guest

0

ベストアンサー

constを外せばうまくいったんですが、constありではどうすればいいのでしょう

返り値もconst char *にしてください。

投稿2018/08/17 03:39

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/08/17 03:41

うむ、それが本筋ですね
fu7mu4

2018/08/17 03:47

str_chr関数の返り値の型をconst char *に変えて、returnの引数の型とあわせるというとこですね。
soboro

2018/08/17 05:07

問題では返値の型がcharになってたので、ミスなのでしょうか。 わかりやすい説明ありがとうございます。
fu7mu4

2018/08/17 06:03 編集

こうかも? ````c #include <stdio.h> char *str_chr(const char *x, int c) { char *s = (char *) x; while (*s) { if (c == *s) return s; *s++; } return NULL; } ````
rubato6809

2018/08/17 07:13

出題者の意図はわかりませんが、それもアリかな。 で、*s++; は s++; に直してください笑。
guest

0

return (void*)s;

これではどでしょ

投稿2018/08/17 03:36

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soboro

2018/08/17 05:03

そのような方法もあるのだと勉強になりました。
y_waiwai

2018/08/17 05:06

ワーニングを潰すための方法、と取っておいてください キャストというのは強力すぎるので、むやみに多用するとデメリットが大きくなります
soboro

2018/08/17 05:08

ありがとうございます。
rubato6809

2018/08/17 07:15

y_waiwaiさん そこでキャストするなら、 return (char*)s; とするのが自然でしょ。void*にしなきゃならない理由はありませんよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問