• ベストアンサー

文字列の判別させるプログラム

長さの等しい2つの文字列を入力しては、片方を何文字か左に回転したときにもう一方と一致するかどうか調べる関数rotateLを作るのですが、よくわかりません。 たとえば、 文字列1=abcde 文字列2=bcdea なら 一回転で一致 となる関数なのですが、この判別はどのようにすればいいのですか?

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

  • ベストアンサー
回答No.5

これは、実際にやってみれば良くわかります。 1: [a] [b] [c] 2: [aを手に持つ] [b] [c] 3: [空白] [b] [c] 4: [b] [空白] [c] 5: [b] [c] [空白] 6: [b] [c] [手に持ったaを置く] 7: [b] [c] [a] これを、そのままプログラムすると次のようになります。 /* 文字列a,b の b を rotate left し、同じ文字列か調べる ----- 実行例 ----- Input string a b? abcde bcdea They are same words(lotate left= 4). Input string a b? ^D */ #include <stdio.h> /* printf(), fprintf() */ #include <string.h> /* strlen(), strcmp() */ #define SIZE 256 #define input(a,b,c) printf(a),scanf("%s %s", b,c) int lotate_left(char a[], char b[], int len); int main(void) { char a[SIZE], b[SIZE]; int len, n; while(input("Input string a b? ", a, b) != EOF ){ if((len=strlen(a)) != strlen(b)){ printf("Different size error."); } else { n = lotate_left(a, b, len); printf("They are %ssame words(lotate left= %d).\n", n ? "" : "not ", n); } } printf("\n"); return 0; } int lotate_left(char a[], char b[], int len) { int i, j=len, temp; while(j--){ /* 文字サイズ分左へシフトを繰り返す */ temp = b[0]; for(i = 1; i<len; i++){ b[i - 1] = b[i]; } b[i - 1] = temp; if(strcmp(a, b) == 0) return len - j; } return 0; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>片方を何文字か左に回転したときに・・  配列の回転?に、% を使った例です(◆)。  (「頭」を2回チェックしている・・改良の余地あり) #include <stdio.h> #include <string.h> int rotateL( char cStr1[], char cStr2[] ) {  int nn = 0, mm, iLen, iEnd, iAns = -9;  iLen = strlen( cStr1 );  while( -9 == iAns ){   while( cStr1[ nn ] != cStr2[ 0 ] ) nn++; // 頭出し   mm = 0;   iAns = nn;   iEnd = iLen;      while( iEnd-- ){ // 頭以降の文字確認      if( cStr1[ nn % iLen ] != cStr2[ mm ] ){ // ◆     iAns = -9; // 不一致     break;    }    nn++;    mm++;   }  }  return( iAns ); } void main() {  int iRet;  char cStr1[ 16 ] = "1234+++67890"; // こちらを回転  char cStr2[ 16 ] = "+678901234++";  iRet = rotateL( cStr1, cStr2 );  printf( "%d\n", iRet ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • ky072
  • ベストアンサー率60% (85/140)
回答No.3

こんな感じでいかがでしょう。 #2 の方の回答と判別の方針は一緒です。 「文字列1」を2つ連結した文字列の中から、「文字列2」を検索します。 2つの文字列の長さが等しいことが保証されている必要があるので、 プログラムではチェックするようにします。 -- #include <stdio.h> #include <stdlib.h> #include <string.h> static int rotateL ( const char * s1, const char * s2 ){ int idx = -1, n1, n2; if( s1 && s2 && ( n1 = strlen( s1 ) ) == ( n2 = strlen( s2 ) ) ){ char *x = NULL, *buf = malloc( n1 + n1 + 1 ); memcpy( buf, s1, n1 ), memcpy( buf + n1, s1, n1 ), buf[n1+n1] = 0; if( ( x = strstr( buf, s2 ) ) ){ idx = x - buf; } free( buf ); } return idx; } extern int main ( int argc, char ** argv ){ int idx = -1; const char *s1 = "abcde", *s2 = "bcdea"; if( argc == 3 ){ s1 = argv[1]; s2 = argv[2]; } idx = rotateL( s1, s2 ); if( 0 <= idx ){ printf( "MATCH! (n=%d)\n", idx ); } return EXIT_SUCCESS; }

全文を見る
すると、全ての回答が全文表示されます。
  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.2

文字列2を2つ連結してstrstrで文字列1が含まれるか検索する。 文字列1=abcde 文字列2=bcdea なら 判定文字列=bcdeabcdea となり、この文字列中に文字列1が含まれるか見ればいい 検索結果で頭から何文字目から一致するかわかれば、 それから回転させた回数も計算できますね。 これでどうです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「どうすればいいのか」は自分で書いてますね. 「片方を何文字か左に回転したときにもう一方と一致するかどうか調べる」んです.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 初歩的なプログラムなんですが・・・

    まだ勉強始めたばっかりで色々ネットのページも調べてみたんですがどうしてもわからないのでどなたか教えてもらえませんか?? scanf()関数を用いて同じ長さの文字列を2つ入力して、この2つの文字列が同じ文字列ならば、 「等しい文字列を入力」と画面表示して、異なるならば「異なる文字列を入力」と画面表示したいんですが^^; 実行結果は 同じ長さの文字列を2つ入力しなさい abcde abcde 等しい文字列を入力 のような結果がほしいんです。 どなたかお願いします^^;

  • 重複した文字列を一つにしたい

    入力された文字列から連続した特定の文字列を一つにまとめたいです。 例えば、まとめたい文字列が「123」だとすると、 「…abcdefghijk…」や 「…abcde123fghijk…」はそのままで 「…abcde123123123fghijk…」のようなものを 「…abcde123fghijk…」としたいです。 取り除くだけでしたら、 $mojiretu =~ s/123//g; で簡単だったのですが、 やり方に見当もつかず悩んでいます。

    • ベストアンサー
    • CGI
  • 文字列にある数字を判別するにはどうすればいいでしょうか?

    文字列にある数字を判別するにはどうすればいいでしょうか? 例え:[今年は2010年7月21日です]という文字列有ります。 この文字列の中で数字が6個ありますが、 どのような方法で判別することが可能でしょうか? ActionScript2.0です。 自分の考えては、とりあえず文字列を配列にする必要があると思い、 ary = str.split("");にしました。 その後、forなどを利用して配列を一個ずつ呼び出して、数字か文字かを判別し、数字がいくつあるかを わかりたいですが、、、うまくできません。 是非、よろしくお願いします。

    • ベストアンサー
    • Flash
  • Excelスプレッドシート上の文字列を簡単に判別する方法

    これまで手で集計していたExcel上の数字データを自動計算するために sumif関数などを使っていろいろ計算式を組み込んでいるのですが、 関数を使って計算した結果と手で計算した結果が違ってきてしまい、困っております。 シート上の数字の中に文字列が混じっている可能性がありますが、 シート上のセルの多くの数字の中で、どれが文字列なのか一見判別できず、すべての数字について、isunumber関数を使って調べたり、一からすべて数字を入力しなおすのも大変です。 シート上の数字をすべて関数の計算対象になる数列データに一括変換する方法はないのでしょうか? 困っています。どなたか助けて下さい。 どうぞ宜しくお願い申し上げます。

  • VBA ユーザーフォームのテキストから列を判別

    VBAの質問です。エクセルは2007を使用しています。 ≪やりたい事≫ ユーザーフォームに入力したアルファベットから列を判別して、 アクティブセルに 文字列&”∞” の関数を入力したいです。 詳細は画像をご確認頂ければと思います。 何卒宜しくお願い致します!!

  • 文字列を比較するプログラム

    キーボードより文字列aと文字列bを入力し、比較する(どちらが辞書並びで先かを表示する)プログラムを作れ。但し、strcmp関数を用いてはならない。 という問題があるんですが文字列の比較のしかたがまったくわかりません。わかりやすく教えていただけるとありがたいです。

  • 文字列が連続しているかどうか調べたいのですが、良い方法はないでしょうか

    文字列が連続しているかどうか調べたいのですが、良い方法はないでしょうか? ExcelVBAです。 例えば"abc12saaa"などと文字列があって、4文字以上同じ文字が連続したいるか、4文字以上順番になっている文字があるかを調べるにはどのような方法があるでしょうか。 順番になっている文字とは"abcde"とか"1234"のようなものです。 1文字ずつ取り出して比較したり、1文字ずつAsc関数で数値化すればできるとは思いますが、スマートな方法、既存の関数とかないでしょうか。 よろしくお願いします。

  • 文字列から文字列を検索するプログラム

    現在、C言語を学習しています。 文字列から文字列を検索する関数に「strstr]がありますが、自作関数として自分で作成する方法を考えております。 文字列から文字を検索する事は出来たのですが、文字列を検索するシーケンスがわかりません。 有識者の方、御教授よろしく御願い致します。

  • エクセル ある文字列を入れるとある文字列を返す

    エクセルでの関数、ど素人です。一応自分で調べたのですが、無理なので質問させていただきます。よろしくお願いいたします。 エクセルで、時刻ですが文字列として1745~2345までを手入力します(1745,とか2000とか2330とか。。。。。) 入れた文字列によって、すぐ横のセルに1745、1800、1815であれば8.00、1830からは0.25刻みで8.25、1845であれば8.50、1900であれば8.75。。。。2330であれば13.25、2345であれば13.50と言ったように、入力した文字列に対しある特定の文字列を自動的に入れたいのですが、どのような関数を使えばよろしいのでしょうか。 私が行おうとしたのは、別シートに文字列一覧を作り、if(特定のセル(手入力するセル)=別シートの1745~2345まで、横のセル=別シートの8.00、8.00、8.00~13.50まで)や、sumif、lookupを使ってみましたが撃沈です。 どなたか教えていただきたく、お願いいたします。

  • 文字列のプログラムについて

    キーボードから入力された1行の文字列を逆順(abc -> cba)にして、 更に大文字なら小文字にし、小文字なら大文字にして表示するプログラムを作る問題です。 とりあえず getcharを使い、キーボードから文字列を入力しその文字列を 配列変数に保存し、その配列変数について変換させるのだと思いますが、 どうしてもgetcharでキーボードからえた文字列を配列変数にいれる方法がわかりません。 教えてください。

このQ&Aのポイント
  • 去年の12月から光契約したが3月18日から9日毎にインターネットがダウンし始め現在もほぼ9日毎にルーターの電源を抜き差し、初めから立ち上げ操作をしている。
  • インターネットがダウンする原因は何か?
  • ひかりTVのサービスやISPぷららに問題があるのか?
回答を見る