• ベストアンサー

行が壊れました。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% (2126/6288)
回答No.2

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

systam
質問者

お礼

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

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

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

systam
質問者

お礼

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

関連するQ&A

  • get()を否定されました…どのように直せばいいでしょうか…

    プログラムで、文中のpikatyuという文字をraityuに変換させるプログラムを作れという問題で、以下のプログラムを作成しました。 すると、警告文で prog.c: In function 'main': prog.c:14: warning: unused variable 'c' prog.c:33: warning: control reaches end of non-void function /var/tmp//cc1HByZn.o(.text+0x51):Infunction 'main': : warning: warning: this program uses gets(), which is unsafe. というものが出てきました。 コンパイルはできるのですが、 講師がgets()を使うなと言うのです。 どのようにすれば認めてもらえるのでしょうか? どこをどのように直せばいいか教えてください。お願いします。 #include<stdio.h> #include<string.h> #define SIZE 512 char *search(char *,char *); void replacce(char *,char *,char *); int main(int argc,char, **argv) { char c; int i = 0, j = 0; char a[SIZE][SIZE]; for (i = 0; i < SIZE; i++) { gets(a[i]); } while(a[j][0] != '\0') { replace(a[j],"pikatyu","raityu"); printf("%s\n", a[j]); j++; } } void replace(char *text, char *key, char *rep) { char *p,buf[SIZE]; p = search(text, key); while(p != NULL) { *p ='\0'; strcpy(buf, p + strlen(key)); strcat(text, rep); strcat(text, buf); p = search (p + strlen(rep), key); } } 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); }

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • C の文字列置き換え

    #include <stdio.h> // buffer overflowは無視している文字列置き換え関数 void replace(char *buf, char *pre, char *aft) {   char *p;   p = strstr(buf, pre);   if (p){     char *p_2 = p + strlen(pre);     replace(p_2, pre, aft);     memmove(p + strlen(aft), p_2, strlen(p_2)+1);     memcpy(p, aft, strlen(aft));   } } int main(void) {   char buf[1024] = "C:\\programfile\\LOG";   replace(buf, "LOG", "RESULT");   printf("%s\n", buf);   return 0; } というソースが以前出ていたのですがこのバッファーオーバフローはどうすれば回避できるのですか? お願いします

  • 小文字のみを数える方法

    小文字のみを表示させるプログラミングがいくらやってもできません。範囲指定をどこですれば良いのかわからず、全部の文字数をカウントしてしまいます。 ご指摘お願いします。 #include <stdio.h> #include <string.h> int main(void) { char str[256]; int a; printf("大文字と小文字をランダムに入力\n"); gets(str); printf("小文字の数は%dです\n",strlen(str),a); return(0); }

  • 素因数分解のプログラムを作成しました。

    素因数分解のプログラムを作成しました。 なぜか11桁を超えた場合、正しく表示されません!! アドバイス等お願いします。 あと、処理時間も組んでみましたがこちらもうまくいきません。 改善をお願いしますm(_ _)m #include<stdio.h> #include<time.h> void fanction(int); void main(void) { int n; clock_t start_time, end_time; printf("整数を入力してください。\n"); scanf("%d",&n); start_time = clock(); fanction(n); end_time = clock(); printf("\n\n処理時間:%.3f秒\n",(double)(end_time - start_time) / CLOCKS_PER_SEC); return 0; } void fanction(int n) { int m; char c='='; for(m=2;n != 1;m++) { while(n%m == 0) { n = n/m; printf("%c%d",c,m); c='*'; } } }

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • ループが変な動作をする

    このプログラムは表示された数値を逆に入力するプログラムです。 入力した値の正誤を表示します。結果に問わず3回で終了する ようにしたいです。 ところが、下のプログラムを動作させたところ間違いを3回入力 したら終了するという仕様になってしまっています。 何がおかしいのでしょうか? for(m=0;m<3;m++) { ---------------------------------------(省略) if(strcmp(gyakuho,nyuu)!=0) { printf("\a間違いです。\n"); } else { printf("正解です。\n"); count++; } } おそらく、間違っているのはループの中のこの部分なのでは ないかと思います。 #include<stdio.h> #include<time.h> #include<stdlib.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return -1; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 0; } int main(void) { char gyaku[4]; char gyakuho[4]; int i,j,m; char nyuu[4]; int k=0; int count=0; clock_t start,end; char x; srand(time(NULL)); printf("4桁の数値を記憶しましょう。\n"); start=clock(); for(m=0;m<3;m++) { x='1'+rand()%9; gyaku[0]=x; for(i=1;i<4;i++) { do{ x='0'+rand()%10; for(j=0;j<i;j++) { if(x==gyaku[j]) { break; } } }while(j<i); gyaku[i]=x; } gyaku[4]='\0'; printf("%s",gyaku); fflush(stdout); sleep(500); printf("\r \n"); for(i=3;i>=0;i--) { gyakuho[k++]=gyaku[i]; } gyakuho[4]='\0'; printf("表示された数字を逆に入力せよ:"); scanf("%s",nyuu); if(strcmp(gyakuho,nyuu)!=0) { printf("\a間違いです。\n"); } else { printf("正解です。\n"); count++; } k=0; } end=clock(); printf("3回中%d回成功しました。\n",count); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • コンパイルエラーです。

    #include <stdio.h> #include <time.h> int main() { float a = 1; float b = 1; clock_t start, end; for(a <= 9999; a++) for(b <= 99999; b++) printf("%fx%f=%f\n",a, b, a*b); end = clock(); printf("[4x4]\n####################\n%fs\n####################\n",(double)(end - start) / CLOCKS_PER_SEC); return 0; } エラーが起きるのですが、僕には、どこが間違っているのかわかりません。 教えてください。

  • C言語に詳しい方お願い致しいます

    文字列Aから文字列Bを除いた結果を表示するプログラムなのですが 一ヶ所分からない部分があります。 #include <stdio.h> #include <string.h> int main(void){  char str1[] = "abcdefg";  char str2[] = "cde";  char str3[128] = "";  char *p1 = str1, *p2;  size_t len;  len = strlen(str2);  while((p2 = strstr(p1,str2)) != NULL) {   strncat(str3,p1,p2 - p1);   p1 = p2 + len;   printf("----\n");   printf("p2=%s\n", p2);   printf("str3=%s\n", str3);   printf("p1=%s\n", p1);  }  strcat(str3,p1);  printf("%s\n",str3);  return 0; } while文中の p1 = p2 + len; なのですが、何故これでp1の内容が「fg」になるのでしょう。

  • 最速化するにはどうしたらいいでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double abssucc(double x){ return x / (1 - pow(2,-53)); } double abspred(double x){ return x * (1 - pow(2,-53)); } double succ (double x){ if(abs(x) < pow(2,-1022)) return x + pow(2,-1074); if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow(2,-1022)) return x - pow(2,-1074); if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムをpow関数使わないでもっと速く動かしたいのですが、やり方がわかりません。 教えて下さい!お願いします。