- ベストアンサー
行が壊れました。1行の長さが2048文字を越えています。
11行目の""の中の文字数を増やしたいのですが、そのまま増やすと「行が壊れました。1行の長さが2048文字を越えています。」といったメッセージが出てきてしまいます。 ""の中を改行するとエラーになってしまいます。 できることなら""の中を何万文字と増やしていきたいです。 実行結果が欲しいだけなのですが…。 ほとんどこういったものを使ったことがないので、簡単に解決できるのかできないのかすらわかりません。ちなみにMicrosoft Visual c++ 6.0を使用しています。 どうかよろしくお願いします。 [1] #include<stdio.h> [2] #include<string.h> [3] #include <time.h> [4] [5] [6] char *search(char *,char *); [7] [8] int main(void) [9] { [10] [11] static char text[]="あいうえお"; [12] char *p,*key="pen"; [13] [14] clock_t start,end; [15] start = clock(); [16] [17] [18] [19] p=search(text,key); [20] while (p!=NULL) [21] { [22] printf("%s\n",p); [23] p=search(p+strlen(key),key); [24] } [25] end = clock(); [26] printf("%.5f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); [27] return 0; [28] } [29] [30] char *search(char *text,char *key) [31] { [32] int m,n; [33] char *p; [34] [35] m=strlen(text); [36] n=strlen(key); [37] for(p=text;p<=text+m-n;p++) [38] { [39] if(strncmp(p,key,n)==0) [40] return(p); [41] } [42] return(NULL); [43] }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>できることなら""の中を何万文字と増やしていきたいです。 う~ん、現実的ではありません。 一般には、「何万文字」とある「テキストファイル」から、1行ずつ「読み込み」、その中からキーとなる文字列と合致した「(行通し番号)行」を表示します。 このためには、ファイルの「オープン(プログラムで読み込める状態にする)」や実際の「読み込み」の関数を習得しないといけません。 fopen(), fclose(), fgets(), fgetc() など・・。 http://www.bohyoh.com/CandCPP/C/Library/index.html 見本となるソースは、当カテゴリにも沢山載っています。 一旦覚えてしまうと、以後はそれを応用するだけです。 今回の例ですと、 ・スタート時間を把握する前にファイルオープン。 ・把握後に、ファイル終了まで1行ずつ( text に)読み込み、 ・p = search( text, key ); 以降を実行するようにします。 ・終了時間の把握が終わったらファイルクローズ。 質問者様のソースに、決まり切ったものを追加するだけなので簡単です。 一歩進めて「コマンドライン」について学ばれると、・・・・出来上がった実行文に汎用性を持たせることが可能です。 これも、見本ソースはいっぱいころがっています(ヒント int argc, char *argv[] )。 +++++++++++++++++++++++++++++++++++++++ >実行結果が欲しいだけなのですが…。 文字列 text[] 中の "pen" に合致した以降を出力するものですね。 下のソースをコピペし、実行してみて下さい。 #include <stdio.h> #include <string.h> #include <time.h> char *search( char *text, char *key ) { int m, n; char *p; m = strlen( text ); n = strlen( key ); for( p = text; p <= text + m - n; p++ ){ if( strncmp ( p, key, n ) == 0 ) return( p ); } return( NULL ); } int main( void ) { static char text[] = "pen1 pen2 pen3 pen4 pen\n"; char *p, *key = "pen"; clock_t start, end; start = clock(); p = search( text, key ); while ( p != NULL ){ printf( "%s\n", p ); p = search( p + strlen( key ), key ); } end = clock(); printf( "%.5f秒かかりました\n", (double)( end - start ) / CLOCKS_PER_SEC ); return( 0 ); }
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
ああ, ついでですが, 規格は ・(「\ + 改行」を処理したあとの) 1行の長さは 2048バイト以下 ・(結合したあとの) 文字列リテラルの長さは 2048バイト以下 のときにのみ動作を保証していた, ような気がします. もちろん実際の上限は処理系に依存しますが.
お礼
勉強になります!ありがとうございます。
- dic2008
- ベストアンサー率53% (7/13)
static char text[]="あい\ うえお"; のようにすれば解決します さらに言えば static char text[]="あい\ うえお\ かきくけこ"; のようにすればいくらでも追加できます
お礼
このような方法もあるのですね。ありがとうございます。とても助かりました!
- asuncion
- ベストアンサー率33% (2127/6289)
>そのまま増やすと そのままとは、どういう意味でしょうか? static char text[]="あいうえお" "かきくけこ" "さしすせそ" "たちつてと"; のようにすれば、 static char text[]="あいうえおかきくけこさしすせそたちつてと"; と同じになります。
お礼
早速試してみました!おかげ様で今回の問題について無事解決できました!ありがとうございます!
- Tacosan
- ベストアンサー率23% (3656/15482)
2つの連続する文字列 (空白や注釈を含んでよい) は, コンパイラが 1つの文字列に連結してくれます.
お礼
どうもありがとうございます!全然使ったことないものでコンパイラという言葉すらあまり聞いたことがありません…。もっと勉強します。ありがとうございました。
お礼
ご丁寧にありがとうございます!モチベーションあがりました!いただいたソースを試してみたところとても綺麗にできました。勉強して自分のソースと比べてみます。