ホーム » 2023 » 6月 » 07

日別アーカイブ: 2023年6月7日

2023年6月
 123
45678910
11121314151617
18192021222324
252627282930  

検索・リンク

fgetsではみ出たら

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 ) ; } } }

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー