文字列e番目の要素のポインタを返す関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ohagi
記事: 31
登録日時: 3年前

文字列e番目の要素のポインタを返す関数

#1

投稿記事 by Ohagi » 3年前

参考書の演習問題で

"文字列sの中に文字cが含まれていればその文字へのポインタを返す変数を作成せよ。(添字演算子を用いずに実現すること。)必須関数:char *str_chr(const *s, int c) { /* */}"

というものが、サンプル回答もなく困っています。

コード:

#include <stdio.h>


char *str_chr(const char *s, int c)
{
  
  while (*s)
    if (*s++ == c)
      break;
  
  return s;  /* warning C4090: 'return': different 'const' qualifiers */
  
}


int main(void)
{
  char str[128];
  char c;
  
  puts("入力された文字列str[128]内の文字cのポインタを返します。");
  printf("str = ");  scanf("%[^\n]", str);
  printf("c = ");  scanf("%c%*c", &c);


  printf("入力された文字str[128] = \"%s\"内の文字%cのポインタは%pです。\n",
	 str, c, str_chr(str, c));

  return 0;
  
}
ポインタを使って文字列を走査していくのはわかるんですが

走査した後にどのようにポインタを送ればいいかわかりません。

指定されている関数の引数にconstが使われているためか*str_chr関数でreturn sができません。

どういう記述方法ならポインタをreturnで返せるのでしょうか。

お手数ですが回答いただけると助かります。

アバター
amehirune
記事: 181
登録日時: 5年前
住所: どっか
連絡を取る:

Re: 文字列e番目の要素のポインタを返す関数

#2

投稿記事 by amehirune » 3年前

const char 型変数を返したいのであれば、戻り値もconst charにすればよいと思います。

他、不具合と思われる個所が数か所見つかりましたので訂正します。

08>if(*s++ == c)
11>return s;
 ここは後置インクリメントを用いた判断になっています。
 たとえ指定文字が見つかったとしても、これだと「見つかった文字の次の文字のポインタ」を返してしまいます。

23>printf("c = "); scanf("%c%*c",&c);
 私はこういった構文を書いたことがないのでわかりませんが、逆ではないでしょうか?
 上記のプログラムですと、cには必ず(?)改行\nが格納されてしまいます。たぶん。

まとめです。余計なデバッグ用プログラムもオマケでついてきています。

コード:

 const char *str_chr(const char *s, int c)
{


  
	while (*s){
		printf("\t%c->%p",*s,s);
		if (*s++ == c){
			printf("\t文字を発見!");
			break;
		}
		printf("\n");
	}
	printf("\n");
  
  return (s-1);  /* warning C4090: 'return': different 'const' qualifiers */
  
}
 
 
int main(void)
{
  char str[128];
  char c;
  
  puts("入力された文字列str[128]内の文字cのポインタを返します。");
  printf("str = ");  scanf("%[^\n]", str);
  printf("c = ");  scanf("%*c%c", &c);
 
 
  printf("入力された文字str[128] = \"%s\"内の文字%cのポインタは%pです。\n",
     str, c, str_chr(str, c));
 
  return 0;
  
}
間違い、ご質問等あれば遠慮なく申してください。
オフトピック
ぶっちゃけ言ってしまうと、C言語なんてほぼ独学ですから…間違った知識もあるかも…
[hr]
【追記 05/07-21:08】あー…これってもしかしてダメな奴か?戻り値改造しちゃダメな奴?
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
みけCAT
記事: 6186
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 文字列e番目の要素のポインタを返す関数

#3

投稿記事 by みけCAT » 3年前

一見問題がクソな気がしますが、C言語標準ライブラリのstrchrも同じシグネチャなので、しかたないですね。
というわけで、起こりうる問題には目をつむって単純にキャストすればいいでしょう。

コード:

char *str_chr(const char *s, int c)
{
  
  while (*s)
    if (*s++ == c)
      break;
  
  return (char*)s;
  
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ohagi
記事: 31
登録日時: 3年前

Re: 文字列e番目の要素のポインタを返す関数

#4

投稿記事 by Ohagi » 3年前

回答ありがとうございます!

デバッグ用コードとても見やすくて助かります。

記述してもらったコードを試したところ、検索文字のポインタが表示されました!

本当にありがとうございます。



ひとつ気になることがあってclとgccの双方でコンパイルの際に

cl.exe
warning C4090: 'return': different 'const' qualifiers

gcc.exe
In function 'str_chr':
23:3: warning: return discards 'const' qualifier from pointer target type return (s-1);

というエラーが排出されます。

結果は正しく検索文字のポインタを返しているので問題ないと思うのですが、何か分かることとかってあるでしょうか?

本命の問題は解決したので特に問題ないようでしたら、解決にしてトピックを閉じようと思います。

アバター
amehirune
記事: 181
登録日時: 5年前
住所: どっか
連絡を取る:

Re: 文字列e番目の要素のポインタを返す関数

#5

投稿記事 by amehirune » 3年前

警告>私のコードでですか?みけCAT大先輩様のコードでですか?
もし大先輩様のコードであるならば、doubleをintにキャストするときにでてくる警告と
同じようなものだと考えてもらっても全然かまいません。

というか、私のコードでも大先輩様のコードでも(私の環境ですと)そういった警告文は表示されませんでしたが…
環境が古いせいですかね?
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

Ohagi
記事: 31
登録日時: 3年前

Re: 文字列e番目の要素のポインタを返す関数

#6

投稿記事 by Ohagi » 3年前

あまり気にしなくていい警告なんですね。

回答してくださった御二方、ありがとうございました!!

閉鎖

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