2012-04-01 10 views
2

コンテキスト:私はテキストを入力として文字配列に格納するプログラムを作ることを試みています。次に、配列の各要素を10進数として出力します。例えば。 "Hello World"は72、101などに変換されます。私はこれを簡単なASCII2DECコンバータとして使用します。私はオンラインコンバータがあることを知っていますが、私はこれを自分で作成しようとしています。不明なサイズの配列を割り付ける

問題:コンパイル時にサイズが不明な配列を割り当てて、入力したテキストと正確に同じサイズにするにはどうすればよいですか?だから私は "Hello World"を入力すると、ちょうど "Hello World"を格納するのに必要な正確なサイズの配列を動的に作成します。私はウェブを検索しましたが、私が利用できるものは何も見つかりませんでした。

+2

どのようなプログラミング言語ですか? :) – MattJ

+0

私はCでこれをやろうとしています:) – Tuntuni

+0

あなたの問題が解決されてうれしい!正解を受け入れ、必要に応じて上/下の投票を行う必要があります。詳細については、http://meta.stackexchange.com/a/5235およびhttp://stackoverflow.com/faq#howtoask – MattJ

答えて

1

私はあなたがCを使用していることがわかりは、 。私はそれはあなたがこの問題を持っているでしょう最も一般的なコンパイル言語の一つだとして、あなたは、Cの意味を推測するつもりだ

#define INC_SIZE 10 

char *buf = (char*) malloc(INC_SIZE),*temp; 
int size = INC_SIZE,len = 0; 
char c; 

while ((c = getchar()) != '\n') { // I assume you want to read a line of input 
    if (len == size) { 
    size += INC_SIZE; 
    temp = (char*) realloc(buf,size); 
    if (temp == NULL) { 
     // not enough memory probably, handle it yourself 
    } 
    buf = temp; 
    } 
    buf[len++] = c; 
} 
// done, note that the character array has no '\0' terminator and the length is represented by `len` variable 
+0

しかし、長さが7文字で、バッファが10に割り当てられたテキストを入力するとどうなりますか?あなたが入力したテキストと同じ長さの配列をどうやって作りますか? – Tuntuni

+1

真剣に?後でそれを短くしてください。前にプログラミングをしたことがありますか?この宿題ですか? –

+0

@ Tuntuni:whileループの最後に 'realloc(buf、len);'を追加するだけです。 – LeleDumbo

0

通常、メモリの制約がないPCのような環境では、配列/文字列/何らかの64Kを動的に(言語に依存する)割り当て、インデックス/ポインタ/現在の終点+1。新しいデータを配置する次のインデックス/ロケーション。

+0

を参照してください.Cでこれを行う方法の例を教えてください。私は本当に失われています。:/ – Tuntuni

0

あなたはcppの言語を使用する場合は、次のコードのように、あなたは、[]入力文字を格納する文字列を使用し、オペレータが文字にアクセスすることができます。

std::string input; 
cin >> input; 
+0

私はC++でプログラミングを始めましたが、私はC++でそれをどうやって行うのかよく慣れていましたが、今はCで始まりました。どのようにCでこれをやりますか? – Tuntuni

0

:あなたはこのような何かを行うことができます。

関数内で宣言する変数は、スタックに格納されます。これは素晴らしく効率的で、関数が終了したときにクリーンアップされます。唯一の問題は、各関数のスタックスロットのサイズが固定されており、関数の実行中は変更できないということです。

メモリを割り当てることができる2番目の場所は、ヒープです。これは、実行時にメモリを割り当てたり、割り当てを解除したりすることができます。あなたはmalloc()で割り振り、終了したらfree()を呼び出します(これはメモリリークを避けるために重要です)。

ヒープ割り当てでは、サイズはになります。時間ですが、必要に応じて拡張できない固定スタックスペースに格納するよりも優れています。

これは、動的に割り当てられたバッファを使用してASCIIコードに文字列をデコードするためのシンプルかつ愚かな機能は次のとおりです。

char* str_to_ascii_codes(char* str) 
{ 
    size_t i; 
    size_t str_length = strlen(str); 
    char* ascii_codes = malloc(str_length*4+1); 
    for(i = 0; i<str_length; i++) 
     snprintf(ascii_codes+i*4, 5, "%03d ", str[i]); 
    return ascii_codes; 
} 

編集:あなたがちょうどバッファを取得したいコメントに言及しました。上記の例では、文字列内の各項目を既知の長さにし、余分なスペース文字をトリミングしないでコーナーをカットします。これは、これらの問題を修正するよりスマートなバージョンです。

char* str_to_ascii_codes(char* str) 
{ 
    size_t i; 
    int written; 
    size_t str_length = strlen(str), ascii_codes_length = 0; 
    char* ascii_codes = malloc(str_length*4+1); 
    for(i = 0; i<str_length; i++) 
    { 
     snprintf(ascii_codes+ascii_codes_length, 5, "%d %n", str[i], &written); 
     ascii_codes_length = ascii_codes_length + written; 
    } 
    /* This is intentionally one byte short, to trim the trailing space char */ 
    ascii_codes = realloc(ascii_codes, ascii_codes_length); 
    /* Add new end-of-string marker */ 
    ascii_codes[ascii_codes_length-1] = '\0'; 
    return ascii_codes; 
} 
+1

ありがとうございました。 :) malloc()を呼び出した後、char *へのキャストは本当に必要ですか?これはあなたの例に関連していない、私はそれが本当に必要かどうかを知りたい。 :) 再度、感謝します! – Tuntuni

+0

void *をキャストする必要はありません。また、積極的に無効にするものもあります。 Wikipediaには、mallocをキャストするための議論の良い概説があります:https://en.wikipedia.org/wiki/Malloc#Type_safety – MattJ

関連する問題