• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:strncmpで&を使わずに書く方法)

strncmpを使わずに文字列の比較をする方法

このQ&Aのポイント
  • C言語のstrncmp関数を使わずに文字列の比較を行う方法について説明します。
  • プログラム中で&を使用せずに文字列の一部を比較する方法について紹介します。
  • &を使用せずに文字列の一部を比較することはできますが、その方法には注意が必要です。

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

  • ベストアンサー
  • jgk
  • ベストアンサー率75% (104/138)
回答No.1

strncmp(str + i,se,sel)

kanako26
質問者

補足

試してみるとできました。でも、なぜ、+iと書くとできるのですか?もし、わかれば教えてください。

その他の回答 (7)

回答No.8

No.6 です。 No.7 の方のご指摘通りです。 strcmp ではだめですね。失礼しました。 大きな勘違いをしていたようです。 それだけではなんなので、この場合は、 strstr(&str[i], se) を使う方法もあります。 結果の扱い方が、strcmp 系の関数とはちょっと違いますが。

回答No.7

> strncmp : 比較文字列と同じ長さで、同じ内容の部分の出現回数 > strcmp : 比較文字列と同じ部分の出現回数 > 比較文字列全体を探すのですから、 > if (strcmp(str, sel) == 0) でOKです。 strcmp は単純に文字列を比較するんだから char s1[] = "abdc"; char s2[] = "ab"; strcmp(s1,s2); は0にならんよ。

回答No.6

直接の回答ではありませんが、必要なデータ(文字列の長さ)を、一度変数に代入してから、使うという流儀は、わかりにくいプログラムになってしまうことがあります。 この場合だと、 main() { char str[]="kamigamie"; char se[]="ami"; int i=0,c=0; while(i<=strlen(str)){ if(strncmp(str,se,strlen(se))==0){ c++; i += strlen(se); }else{ i++; } } printf("%d回含まれている\n"c); } のようにすると、あとから、「sel ってどの部分の長さだったか?」とか、「なぜ、sel なんて足しているのだろう」とか、悩まなくてすみます。 もちろん、こうすると、「毎回文字列の長さを比較すると効率が悪い」という意見が出てきますが、後で見直す時の(人間の)効率の方が、今では、大切です。 さらにいえば、(課題で指定されているのでなければ)この場合は、strncmp ではなく、 strcmp の方が意味がわかりやすいと思いますが。 strncmp : 比較文字列と同じ長さで、同じ内容の部分の出現回数 strcmp : 比較文字列と同じ部分の出現回数 比較文字列全体を探すのですから、 if (strcmp(str, sel) == 0) でOKです。

回答No.5

C言語でのポインタと配列の関係を理解しませう。

参考URL:
http://homepage3.nifty.com/mmgames/c_guide/15-07.html
  • nk2
  • ベストアンサー率23% (6/26)
回答No.4

>#1 >strncmp(str + i,se,sel) strはポインターを示しています。 ポインターに加算すれば、 次の参照ができることは知っていますよね? str[i]だとchar型ですが、str+iだとポインターです。

kanako26
質問者

お礼

strは配列の一番初めのアドレスを示すんですね。やっと意味がわかりました。ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#include <stdio.h> #include <string.h> void main(void){ char str[]="kamigamie"; char se[]="ami"; char *p; int c=0; for(p=str;NULL!=(p=strstr(p, se));p++) c++; printf("%d回含まれている\n",c); }

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 んっと…「なぜ」&を使いたくないのか、の理由にもよるのですが。 基本的には「ポインタの場所をずらしながら」というやり方なので、例えば「ポインタ用にもう一つ変数を用意する」ことで、一応、&を使わずにくみ上げることは可能です。 サンプルを書いておきます。 #include<stdio.h> #include<string.h> int main(void) { char str[]="kamigamie"; char se[]="ami"; int sel,c=0; char *pwk; sel=strlen(se); pwk = str; while(pwk[0] != '\0'){ if(strncmp(pwk,se,sel)==0){ c++; } pwk++; } printf("%d回含まれている\n", c); }

関連するQ&A