• ベストアンサー

行が壊れました。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] }

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 ); }

systam
質問者

お礼

ご丁寧にありがとうございます!モチベーションあがりました!いただいたソースを試してみたところとても綺麗にできました。勉強して自分のソースと比べてみます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ああ, ついでですが, 規格は ・(「\ + 改行」を処理したあとの) 1行の長さは 2048バイト以下 ・(結合したあとの) 文字列リテラルの長さは 2048バイト以下 のときにのみ動作を保証していた, ような気がします. もちろん実際の上限は処理系に依存しますが.

systam
質問者

お礼

勉強になります!ありがとうございます。

  • dic2008
  • ベストアンサー率53% (7/13)
回答No.3

static char text[]="あい\ うえお"; のようにすれば解決します さらに言えば static char text[]="あい\ うえお\ かきくけこ"; のようにすればいくらでも追加できます

systam
質問者

お礼

このような方法もあるのですね。ありがとうございます。とても助かりました!

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>そのまま増やすと そのままとは、どういう意味でしょうか? static char text[]="あいうえお" "かきくけこ" "さしすせそ" "たちつてと"; のようにすれば、 static char text[]="あいうえおかきくけこさしすせそたちつてと"; と同じになります。

systam
質問者

お礼

早速試してみました!おかげ様で今回の問題について無事解決できました!ありがとうございます!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

2つの連続する文字列 (空白や注釈を含んでよい) は, コンパイラが 1つの文字列に連結してくれます.

systam
質問者

お礼

どうもありがとうございます!全然使ったことないものでコンパイラという言葉すらあまり聞いたことがありません…。もっと勉強します。ありがとうございました。

関連するQ&A

専門家に質問してみよう