• ベストアンサー

strlen関数と同じ働きをする関数の作り方

strlen関数の働きをする新たな関数を作りたいですが困っています。急いでいるので至急教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)

noname#30727
noname#30727
回答No.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; }

noname#12862
noname#12862
回答No.5

最初に、変更点を(これが最後のはず)。 下から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 は不要。 とすれば、期待する動作をします。 が、どのように苦戦しているかを示したほうが、 良回答が得られたのではないかと思います。

noname#12862
noname#12862
回答No.4

#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; }

kouhei1015
質問者

補足

このプログラム目的?は文字列の比較です。 補足ではありませんが、このソースの合わしたいですが苦戦しています。 #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関数の定義*/ }

  • -izayoi-
  • ベストアンサー率45% (48/105)
回答No.3

文字列を比較する関数はstrcmpです。 strlenは文字列の長さ(バイト数)を返す関数ですが、ご質問はどちらでしょう? また、既存の関数を使用するのではなく、自作する理由が解りませんが.. 文字列の長さを求めるのであれば、文字列の終端('\0')まで1バイトずつポインタをずらしながらループし、ループ回数をカウントすれば良いです。 文字列比較であれば、上述と同じループ中で、if文を使い1バイトずつ比較します。

kouhei1015
質問者

補足

strcmpの間違いです。strcmp(文字列比較)についての質問です。 自作する理由は学校の課題です。

noname#12862
noname#12862
回答No.2

文字列の比較には、 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)
回答No.1

質問事項が書かれていないようですが、何に困っておられるのでしょうか?

kouhei1015
質問者

補足

strlen関数(文字列の比較する関数)と同じ働きをする関数αを作りたいですがどのように作れば良いのか分かりません。教えて下さい。 ちなみに関数の作り方の構文は知っています。

関連するQ&A

専門家に質問してみよう