2011-12-11 6 views
0

こんにちは、私はchar型の文字列に私は、私は私の別の関数を呼び出す前に、私は同じ配列Cで文字列を空にするにはどうすればよいですか?

で何かを保存することができるように、この文字列を空にしたいということである起こる何

name[50] = "I love programming"

意志この作品を持っています?

name[0] = '\0';

またはいずれかの新しい機能を作成せずに文字列を空にするか、他のライブラリを使用するためにとにかくはありますか?

+0

アレイを「空にした後」に正確に何をしたいですか? – Staven

+0

まあ私の仕事は最長の単語を見つけることです。私はすでに 'name'に最長の単語がプログラミングされているので、' longest_word'という名前の別の配列にそれらを格納するので、配列を空にしてから別の配列@ staven – Ali

+2

次に、 'strncpy(longest_word、name、49)'( 'longest_word'は\ 0に対して少なくとも49 + 1のサイズを持たなければなりません)を使うことができますバイト)。 'strncpy'は' longest_word'にどんなデータが入っていても気にしません。それはそれを上書きするだけなので、何らかの形で "空"にする必要はありません。 – Staven

答えて

2

代わりにmemsetを使用してください。これはバッファを無効にするだけですが、割り当てられたメモリは変数がスコープから外れるとどのようにスタックから解放されますか。

memset (name,'\0',sizeof(name)); 
+0

なぜこれを "name [0] = '\ 0';"にするのが好きですか?あなたは線形のために一定の時間を取引しています。 –

1

IIRC、あなたがmemsetのをこのように使用することがあります:

char * myString; 
... 
size_t len = strlen(myString) 
memset (myString, 0,len); 
5

NULに最初の文字を設定することは完全に可能です。しかし、その文字列がセキュリティの点で慎重だった場合は、memsetでゼロにする必要があります。

編集:マッテオイタリアから

回答は、私がこのテーマに少し深く掘るました。 this document(およびMatteosの回答)memsetによれば、最適化されている可能性があります。したがって、重要な情報をメモリから削除する最適な方法はありません。このドキュメントにはいくつかのオプションがありますが、ポータブルで信頼性の高いものはありません。そのため、新しい機能標準memset_sが提案されています。この機能はまだ存在していないため、携帯ではない(SecureZeroMemory)、信頼性が低い(volatileトリック)、最適ではないオプション(secure_memsetの例)があります。

3

実際には、Cで文字列を空にするという概念はありません。単純に割り当てられたメモリを指すポインタです。そのメモリを最初に "空にする"ことなく、任意の方法で再利用することができます。だから、それを空にする最も簡単な方法は「ちょっとしない」です。

何らかの理由で文字列のすべての内容を明示的に消去したい場合は、他の回答にあるmemsetの方法を使用してください。

印刷したときに何も印刷されない場合、最初の文字を `\ 0 'に設定するという意味で「空」にしたい場合。締結する


、それはすべてあなた本当にが何をしたいかに依存します。 なぜ文字列を「空にしますか?

1

Tehnicallyそれは例えば、正しいです:

char array[10] = "hello"; 
printf("%d\r\n", strlen(array)); // prints 5 
array[0] = '\0'; 
printf("%d\r\n", strlen(array)); // prints 0 
1
memset(name, 0, 50); 

または

bzero(name, 50); 
1

それはあなたが取得したいエフェクトから依存しています。

*name='\0'; 

を、代わりに、あなたは機密性の高いデータから、あなたの文字列をきれいにしたい場合は、あなたがmemsetでそれを完全にゼロにすべきである(いくつかのオペレーティングシステムも持っている:あなたはちょうどあなたが言ったように、あなたが行うことができ、その長さをゼロにしたい場合コンパイラによって最適化されないように保証されるべき「セキュアな」ゼロ調整関数です(Windowsの場合はSecureZeroMemoryを参照してください)。

一方、呼び出している関数が出力バッファとして渡しているバッファを使用していて、その内容を無視している場合は、バッファをそのまま残すことができます。