C言語で長い一行を読み込むのであれば、通常は”それなりに”大きい配列に読み込んでから、strdup() などでデータに応じた大きさで保存する。しかし、それ以上に長い1行を扱いたいのならどうするか…
どうしても長い一行を扱いたいのなら、realloc() などで拡張しながらデータを読み込む。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char buff[ 10 ] ;
char*str ;
if ( fgets( buff , sizeof( buff ) , stdin ) != NULL ) {
// '#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char buff[ 10 ] ;
char*str ;
if ( fgets( buff , sizeof( buff ) , stdin ) != NULL ) {
// '\0'を覚える必要があるので最大sizeof(buff)-1文字まで読み込まれる
int len = strlen( buff ) ;
if ( (str = (char*)malloc( len + 1 )) != NULL ) {
strcpy( str , buff ) ;
// printf( "|%s|\n" , str ) ;
// 通常はここまで書けばひとまず十分。
// fgetsは行末文字'\n'まで読み込むのが基本
// 最終文字が'\n'でなかったら、読み残しがある。
while( buff[ len ] != '\n' ) {
char*rp ;
// '読み残し'を読み込む
if ( fgets( buff , sizeof( buff ) , stdin ) == NULL )
break ;
len = strlen( buff ) ;
// str を realloc() で領域を拡張する
// realloc()は、拡張するときは新しくメモリを確保し、
// 格納されているデータをコピーし、元領域を解放してくれる
if ( (rp = (char*)realloc( str , strlen( str ) + len + 1 )) == NULL )
break ;
else
str = rp ;
// reallocでは、広げられた領域に元データがコピーされているので、
// 後ろに'読み残し'分を追加する。
strcpy( str + strlen( str ) , buff ) ;
// printf( "%s\n" , str ) ;
}
// 読み込んだ一行を表示
printf( "|%s|\n" , str ) ;
free( str ) ;
}
}
}
'を覚える必要があるので最大sizeof(buff)-1文字まで読み込まれる
int len = strlen( buff ) ;
if ( (str = (char*)malloc( len + 1 )) != NULL ) {
strcpy( str , buff ) ;
// printf( "|%s|\n" , str ) ;
// 通常はここまで書けばひとまず十分。
// fgetsは行末文字'\n'まで読み込むのが基本
// 最終文字が'\n'でなかったら、読み残しがある。
while( buff[ len ] != '\n' ) {
char*rp ;
// '読み残し'を読み込む
if ( fgets( buff , sizeof( buff ) , stdin ) == NULL )
break ;
len = strlen( buff ) ;
// str を realloc() で領域を拡張する
// realloc()は、拡張するときは新しくメモリを確保し、
// 格納されているデータをコピーし、元領域を解放してくれる
if ( (rp = (char*)realloc( str , strlen( str ) + len + 1 )) == NULL )
break ;
else
str = rp ;
// reallocでは、広げられた領域に元データがコピーされているので、
// 後ろに'読み残し'分を追加する。
strcpy( str + strlen( str ) , buff ) ;
// printf( "%s\n" , str ) ;
}
// 読み込んだ一行を表示
printf( "|%s|\n" , str ) ;
free( str ) ;
}
}
}