- ベストアンサー
strlen関数と同じ働きをする関数の作り方
strlen関数の働きをする新たな関数を作りたいですが困っています。急いでいるので至急教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.2の改良版 int match (char* s1, char* s2){ int i; for (i=0; s1[i]!='\0'; i++){ if (s1[i] != s2[i]){ break; } } if (s1[i] == s2[i]) { return 0; } else { return -1; } } 文字列終端までi番目の文字を比較して、全部同じなら0を返し、違っていたら-1を返します。s2がs1より短くても文字比較でループを抜けるので問題ないですね。
その他の回答 (6)
strcmpは2つの文字列が同じ時に0を返し、違うときはプラスかマイナスかで文字列の大小を比較できる。 qsortと相性がいいんです。 学校の先生にバレそうな感じに書いて見ました。 int my_strcmp(const char *s1, const char *s2) { while (*s1 && *s1 == *s2) { s1++; s2++; } return (int)*(const unsigned char*)s1 - (int)*(const unsigned char*)s2; }
最初に、変更点を(これが最後のはず)。 下から4・5行目を以下に変更。 ======================= if (t2[i] == '\0'){ if(t1[i] != t2[i]) return -1; else break; } ======================= ポイントだけ。 1) #include <string.h> は不要。 2) int strlen(char*) を int strlen(char*, char*) に変更。 3) if(strlen( str1, str2 )) を if(strlen( str1, str2 ) == -1) に変更。 4) /*strlen関数の定義*/ をmain関数の外におき、 #4(およびここで訂正した)match関数を strlen 関数に名前を変えて置く。 5) int c は不要。 とすれば、期待する動作をします。 が、どのように苦戦しているかを示したほうが、 良回答が得られたのではないかと思います。
#2 です。 先の例だと ABC と ABCabc が一致してしまうので、以下のように変更。 int match (char *s1, char* s2){ int i; int l1=0, l2=0; // 文字列1、2の長さ char *t1, *t2; // 文字列1、2へのポインタ for(i=0; s1[i]!='\0'; i++) l1++; // 文字列1の長さを取得 for(i=0; s2[i]!='\0'; i++) l2++; // 文字列2の長さを取得 l1 > l2 ? (t1 = s1, t2 = s2) : (t1 = s2, t2 = s1); // 長さを比較 for (i=0; t1[i] != 0; i++){ if (t1[i] != t2[i]) return -1; if (t2[i] == '\0' && t1[i] != t2[i]) return -1; } return 0; }
- -izayoi-
- ベストアンサー率45% (48/105)
文字列を比較する関数はstrcmpです。 strlenは文字列の長さ(バイト数)を返す関数ですが、ご質問はどちらでしょう? また、既存の関数を使用するのではなく、自作する理由が解りませんが.. 文字列の長さを求めるのであれば、文字列の終端('\0')まで1バイトずつポインタをずらしながらループし、ループ回数をカウントすれば良いです。 文字列比較であれば、上述と同じループ中で、if文を使い1バイトずつ比較します。
補足
strcmpの間違いです。strcmp(文字列比較)についての質問です。 自作する理由は学校の課題です。
文字列の比較には、 strcmp () を使います。string.h をインクルードする必要があります。 strlen は文字列の長さを取得する関数です。 自作するなら、配列の各項ごとに比較するしかないと思います。 int match (char* s1, char* s2){ int i; for (i=0; s1[i]!='\0'; i++){ if (s1[i] != s2[i]){ return -1; } } return 0; }
- elmclose
- ベストアンサー率31% (353/1104)
質問事項が書かれていないようですが、何に困っておられるのでしょうか?
補足
strlen関数(文字列の比較する関数)と同じ働きをする関数αを作りたいですがどのように作れば良いのか分かりません。教えて下さい。 ちなみに関数の作り方の構文は知っています。
補足
このプログラム目的?は文字列の比較です。 補足ではありませんが、このソースの合わしたいですが苦戦しています。 #include <stdio.h> #include <string.h> int strlen(char*); void main(void) { /*文字列の構造体*/ char str1[81]; //str1の領域確保 char str2[81]; //str2の領域確保 int c; printf("文字列を入力して下さい。\n"); scanf("%s",str1); //str1に文字列入力 printf("入力した文字(文字列)は『%s』です。\n",str1); printf("文字列を入力して下さい。\n"); scanf("%s",str2); //str2に文字列入力 printf("入力した文字(文字列)は『%s』です。\n",str2); if(strlen( str1, str2 )){ printf("入力された文字(文字列)は一致しませんでした。\n");} else{ printf("入力された文字(文字列)は一致しました。\n");} /*strlen関数の定義*/ }