掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
文字列の動的確保の追加 (ID:56374)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 実際に使う際には、一時変数にとって NULL チェックをしてから > text を更新することをお勧めします。 > # この説明を端折ると、普通独力では気づけない気がしてます。 フォローありがとうございました >Banさん たしかに、この説明を省略するのは不親切、不適当でした。 サンプルを次のように改めます。 #include <stdlib.h> #include <string.h> #include <stdio.h> #define CAPACITY 16 #define BUFFSIZE 256 int main( void ) { char** text; size_t size; size_t capacity = CAPACITY; char buff[BUFFSIZE]; size_t i; if( ( text = (char**)malloc( sizeof(char*) * capacity ) ) == NULL ){ fprintf( stderr, "memory allocation failure, malloc\n" ); return 1; } for( size = 0; fgets( buff, BUFFSIZE, stdin ) != NULL; size++ ){ if( capacity <= size ){ char** temp; capacity *= 2; // 領域を倍に広げる temp = (char**)realloc( text, sizeof(char*) * capacity ); if( temp == NULL ){ fprintf( stderr, "memory allocation failure, realloc\n" ); break; } text = temp; } text[size] = (char*)malloc( sizeof(char) * ( strlen( buff ) + 1 ) ); strcpy( text[size], buff ); } for( i = 0; i < size; i++ ){ printf( "%s", text[i] ); } for( i = 0; i < size; i++ ){ free( text[i] ); } free( text ); return 0; } > あと、c++ でなんですが、 new を使う場合 vector の push_back("") > と同じことをするにはどうすればいいですか?realloc()をつかうしか > ないですか? 新たな領域をnew[]で確保し、それまでに格納されたデータを新たな領域にコ ピーし、古い領域をdelete[]で削除することになるでしょう。 しかし、上のサンプルのような処理ならば、Banさんがおっしゃるように、標 準ライブラリのstring, vectorを使うのが普通であり、そうすべきです。 #include <string> #include <vector> #include <iostream> int main() { std::vector< std::string > text; for( std::string line; std::getline( std::cin, line ); ){ text.push_back( line ); } for( size_t i = 0; i < text.size(); ++i ){ std::cout << text[i] << std::endl; } }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.