2016-08-06 5 views
0
#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 
int size=10; 
char string1[50];  
char *string2; 
string2=(char *)malloc(size*sizeof(char)); 

fgets(string1,10,stdin); 
printf("%s",string1); 

fgets(string2,10,stdin); 
printf("%s",string2); 

} 

このコードには2つの文字列があり、もう1つはポインタで動的に作成された配列です。このコードの文字列のサイズはどうなりますか?

  1. 入力が文字列1の場合は50文字未満、文字列2の場合は10文字未満です。サイズを小さくするには、埋められていない領域が無駄になります。
  2. 文字列2の場合、mallocサイズのパラメータが10で、fgetsのサイズパラメータが10です。fgets(string2,50、stdin)のサイズをmallocのサイズより大きくするとどうなりますか?
  3. それぞれの場合に入力文字列の最終サイズを計算する方法sizeof演算子を使用しましたが、string1とstring2のハードコードされたサイズはそれぞれ50と10です
  4. ダイナミック文字列?
+1

1)はい。スペースが無駄になります。回答:割り当てを減らしてください。質問のタイトルは何もありません。 –

+0

2)。クラッシュ。 3)質問が間違っている。 2番目の文字列のサイズは10ではありません。これはポインタのサイズです。通常は4または8です。 –

+0

@WeatherVane入力のために感謝します。 – ekaf

答えて

1
  1. はい、無駄になります。可変長配列を使用して別の制限を使用することも、動的割り当てを使用することもできます。無駄なスペースについて心配する必要があるかどうかは、別の質問です:あなたのプログラムが(ファイルを読むのではなく)手動で入力した文字列を読み込んだ場合、問題が始まる前に多くのスペースを無駄にすることができますメモリの制約が厳しい組み込みシステム
  2. 未定義の動作が発生するため、プログラムは無効になります。それはしないでください。つまり、fgetsが文字列の最大長を占めるのは正確です。
  3. strlenを呼び出して文字列の長さを計算します。ヌルターミネータには1を追加してください。 fgetsを使用し、入力に'\n'がある場合、'\n'は文字列の一部です。
  4. scanfにPOSIX拡張機能を使用し、%ms形式とchar*へのポインタを渡すことができます。これは正確な長さで文字列を割り当てますが、プログラムの移植性が低下します。明らかに、メモリリークを避けるためにこれらの文字列の割り当てを解除する必要があります。
+0

入力のためにありがとうございます。私はそう多くのスペースを心配するべきではないですか?あなたの提案に感謝しました。第4回以外にも、私はその後者を試してみます。 – ekaf

+0

(2)の 'fgets()'に関する記述が間違っています。 ['fgets()'は "多くても' size - 1'文字 "を読むでしょう(http://linux.die.net/man/3/fgets) –

+0

@HonzaRemešそう、私はscanfの%50sと混同しました。ありがとう! – dasblinkenlight

関連する問題