• ベストアンサー

関数について

encyの回答

  • ency
  • ベストアンサー率39% (93/238)
回答No.10

> まったく、その通りですね。 > #8さんが、的を射た答えですね。 > #4は、言い過ぎです。すみません。<(_ _)> いえいえ。。。 ポインタ渡しの関数を作るときに、私がよく使う手でしたので、ちょっとコメントさせてもらっただけです。 そこまで言っていただけると、ちょっと恐縮です。。。 ポインタを引数にとる関数のコメントに「IN/OUT」というのをたまに見かけますけど、そんなことをやるよりも const のありなしでやるほうがよっぽど効果があると思っています。 const なしの場合は、関数で中身を変更される可能性があるし、const つきの場合は絶対に変更されないことが保障されるわけですから。。。 # そもそも、私の場合コメントはあまり信用していませんし。 # あとで更新しようと思って、そのまま放置されていることが結構ありますし。。。 …やばい。。。関係ない話で雑談モードに入りそうなので、この辺で失礼します。

buafk516
質問者

お礼

とてもよくわかりました 本当にありがとうございました

関連するQ&A

  • 文字列strの中から文字cを探すプログラム(C言語)がわからない

    文字列strの中から文字cを探すプログラム(C言語)がわからない 柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。 僕が書いたプログラムを載せます。 /* 文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、 その文字へのポインタを返し、含まれていなければNULLを返す関数 char *str_chr(const char *str, int c) {} を作成せよ。 */ #include<stdio.h> char *str_chr(const char *str, int c){ while(*str){ if(*str==c) return str; str++; }     return NULL; } int main(){ char *str; char c; scanf("%s",str); scanf(" %c",c);     printf("%d",str_chr(str,c)); return 0; } コンパイラは「関数str_chrのif分の中のreturn strの型変換に問題がある」と言っているんです。 型変換はしるつもりは無いのにコンパイラはなぜそのように認識するのでしょうか。 またネット答えを探しましたがどうやらこのreturn strの部分はreturn (char*)strが正解のようです。意味がわかりません。strはポインタなのになぜまたわざわざchar型に変換しているのですか?といか(char*)の意味が根本的にわかりません。 質問ばかりですみません。初心者でポインタがどうにも理解できないんです。 誰か詳しい人教えてください。 お願いします。

  • 文字列中に含まれる文字の個数をカウントするプログラムについて…

    文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。 と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。 多分main関数の部分をちょっといじくればよいと思うのですが…。 どなたかアドバイスをお願いします。 #include <stdio.h> int count(const char *str, const char ch) { int cnt=0; while (*str!='\0') { if (*str==ch) cnt++; str++; } return cnt; } int main() { const char *str="hello,world!"; const ch='o'; int cnt; cnt=count(str, ch); printf("%s中に%cは%d個です\n", str, ch, cnt); return 0; }

  • 前回質問させて頂き、改善できるところはしました。

    前回質問させて頂き、改善できるところはしました。 再度駄目な所をご指摘お願いします。 仕様は出来るだけ標準関数に近いものを自作したいと思っています。 //---------------------------- MyStrstr ----------------------------------// char *MyStrstr(const char *str1, const char *str2) { const char *p1 = str1; const char *p3 = str1; const char *p2 = str2; while(*p1 != *p2 && *p1 && *p2) { *p1++; *p3++; } while(*p1 == *p2){ *p1++; *p2++; } return (*p2 ? NULL : (char*)p3); } //------------------------------ 終了 ------------------------------------// //---------------------------- MyStrcat ----------------------------------// char *MyStrcat(char *str1, const char *str2) { char *p1 = str1; const char *p2 = str2; while(*p1 != NULL){ p1++; } if(*p2){ while(*p2 != NULL){ *p1 = *p2; p1++; p2++; } } if(*p2 == NULL){ *p1 = *p2; } return p1; } //------------------------------ 終了 ------------------------------------// //---------------------------- MyStrcmp ----------------------------------// int MyStrcmp(const char *str1, const char *str2) { const char *p1 = str1; const char *p2 = str2; while(*p1 != NULL || *p2 != NULL){ if(*p1 == *p2){ p1++; p2++; }else{ if(*p1 < *p2) return -1; if(*p1 > *p2) return 1; } } return 0; } //------------------------------ 終了 ------------------------------------// //----------------------------- MyMemcpy -----------------------------------// void *MyMemcpy(void *str1, void *str2, size_t n) { char *p1 = (char*)str1; char *p2 = (char*)str2; while(n--){ *p1 = *p2; p1++; p2++; } return str1; } //------------------------------ 終了 ------------------------------------// //---------------------------- MyStrcpy ----------------------------------// char *MyStrcpy(char *str1, const char *str2) { char *p1 = str1; const char *p2 = str2; while( *p2 != NULL){ *p1 = *p2; p1++; p2++; } if(*p2 == NULL){ *p1 = *p2; } return p1; } //------------------------------ 終了 ------------------------------------// //---------------------------- MyMe

  • C++での戻り値について

    C++で以下のソースを書きました。 どうしてaaaは問題ないのにbbbはだめなのかがわかりません。 どちらも、func1()、func2()で設定した文字列・vectorのポインタを返したいです。 int main() { const char* aaa = NULL; std::vector<const char*>* bbb = NULL; aaa = func1(); bbb = func2(); } const char* func1() { const char* str = NULL; str = "test"; return str; } std::vector<const char*>* func2() { std::vector<const char*>* str2 = NULL; str2->push_back("test2"); str2->push_back("test3"); return str2; } 現在必要に迫られてC++勉強中です。よろしくお願いいたします。

  • strstr()関数の実装内容について。

    strstr()関数が、どのように実装されてるか知りたかったため、strstr.cの中身を見てみたのですが、 分らない処理がありました。 char * __cdecl strstr (const char * str1, const char * str2) {  char *cp = (char *) str1;  char *s1, *s2;  if ( !*str2 )   return((char *)str1);  while (*cp)  {   s1 = cp;   s2 = (char *) str2;   while ( *s1 && *s2 && !(*s1-*s2) )    s1++, s2++;    if (!*s2)     return(cp);     cp++;    }  return(NULL); } while文のネストの部分で、*s1 && *s2 && !(*s1-*s2)とありますが、 (*s1 && *s2) または !(*s1-*s2) のどちらか一方のみではまずいのでしょうか? 解説、アドバイスの程よろしくお願い致します。

  • strcat関数

    学校の課題で strcat関数と全く同じ働きをするmy_strcatを実装せよ という課題がでています。 strcatは char* strcat(char *dest, const char *str) で表され、文字列 strを文字列 dest に合成して 合成された新しい文字列として dest を返します。 例えば、dest = Japan, str = Korea だったら, 関数処理後に、 dest = JapanKorea を戻り値とします。 ********************************************* my_strcat実装について 実装段階で一番の問題になるのが、文字列のサイズです。 とりあえず、私の書いたコードを示します↓ char* my_strcat(char *dest, const char *src) { int i=0; int j=0; while(*dest) { dest++; i++; } while(*src) { *(dest+i) = src[0]; i++; src++; } *(dest+j) = src[0]; //put null at the end of dest return dest; } 試しにdest=Japan,str=Koreaでやってみたのですが、動きませんでした。 原因はdest の文字サイズを無視した無理やりなりな実装だと考えます。 C言語では文字のサイズを一度宣言したら、変えられないと思うので、困っています。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします

  • memcpy,memcmp,strcmp,strlen,strcat,

    memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr 以上の関数を自作しました。 ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。 どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。 char *MyMemcpy(char *str1, char *str2, size_t n) { char *p1 = str1; char *p2 = str2; while(n--){ *p1 = *p2; p1++; p2++; } return str1; } void *MyMemcmp(void *str1, void *str2) { char *p1 = (char*)str1; char *p2 = (char*)str2; int n = 0, k = 0; while( *p1 != '\0'){ *p1++; n++; } while( *p2 != '\0'){ *p2++; k++; } if(n > k){ return str1; }else if(n == k){ return 0; }else if(n < k){ return str2; } } char *MyStrcmp(char *str1, char *str2) { char *p1 = str1; char *p2 = str2; int n = 0, k = 0; while( *p1 != '\0'){ *p1++; n++; } while( *p2 != '\0'){ *p2++; k++; } if(n > k){ return str1; }else if(n == k){ return 0; }else if(n < k){ return str2; } } size_t MyStrlen(const char *str1) { char *p1 = (char*)str1; size_t len = 0; while(*p1 != NULL){ *p1++; len++; } return len; } char *MyStrcat(char *str1, const char *str2) { char *p1 = str1; char *p2 = (char*)str2; while(*p1 != NULL){ *p1++; } while(*p2 != NULL){ *p1 = *p2; *p1++; *p2++; } return str1; } char *MyStrcpy(char *str1, char *str2) { char *p1 = str1; char *p2 = str2; while( *p2 != NULL){ *p1 = *p2; *p1++; *p2++; } *p1 = '\0'; return str1; } char *MyStrstr(char *str1, char *str2) { char *p1 = str1; char *p2 = str2; while(*p1 != *p2) { if(*p1 == '\0'){ return 0; } *p1++; } return p1; } char *MyStrchr(const char *str1, char str2) { char *p1 = (char*)str1; while(*p1 != str2) { if(*p1 == '\0'){ return 0; } *p1++; } return p1; }

  • 配列を返す

    ファイルから読み込んだ一行の文字列を読み込みカンマごとに区切って 返すというプログラムを関数化することで効率を図りたいと思います。 int main() { char buf[1000]; char *str; char *bufG; //ファイルを読み込む  while(fgets(buf,1000,fp) != NULL){//一行ずつ読む str = buf;//先頭アドレスを指す     bufG = //文字列を返す関数  ・  ・  ・ } } //文字列を返す関数 {    for(i = 0; *str != ',' && *str != '\0'; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; return bufG; } 前の質問で自動変数でこの関数を抜けたら廃棄になるというのは わかったんですが(そういう警告がでました) ここからどのようにすれば求めるプログラムになりますか? 引数とかちょとわからないので関数定義を書きませんでした。 (1)ファイルをよみこむ (2)一行ずつ読み込み文字列をbufにいれる (3)ポインタstrをbufの先頭アドレスにする (4)get_word関数にてポインタをずらしていき カンマがあればそこまでの文字列を返す (5)main関数に戻り変数に代入する (6)終端文字があるまで(4)ー(5)を繰り返す。 (7)さらに行数分繰り返す これらの一連の流れをやりたいのですが わかりません。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • C言語 ポインタと配列

    #include <stdio.h> /* scanf("%c", &search); ではなく scanf(" %c", &search); であることに注意する */ char *str_chr(const char *str, char c) { char *find; find = NULL; do { if(*str == c) { find = (char*)str; break; } } while(*str++); return(find); } int main(void) { char str[100] = {0}; char search; char *find; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &search); find = str_chr(str, search); if(find == NULL) { puts("検索した文字は見つかりませんでした。"); } else { printf("検索した文字 %c は\"%p\"にあります。\n", *find , find); } return(0); } このコードのfind = (char*)str;の (char*)str;の部分がどうなっているのかわかりません。 あとこのfindというのは&find[0]という解釈でいいでしょうか? 教えてくださいm(_ _ )m