2016-06-28 8 views
0

ある文字配列の最後の4文字を別の配列にコピーします。私は以下のようにやってみました。Cで文字を1つずつコピーすることは文字列全体をコピーすることです

{ 
char date[20],day[2],year[4]; 
int n,i,j; 
gets(date); 
n=strlen(date); 
j=n-1; 
     for(i=3;i>=0;i--) 
     { 
      year[i]=date[j]; 
      j--; 
     } 
printf("%s",year); 
} 

しかし、私がそれをコピーしたとき、2番目の配列が小さい場合でも、文字列全体と4文字もコピーされます。 たとえば、入力が16 july 1776 の場合、出力はyear=177616 july 1776

どのような原因と解決方法がありますか?

+0

ようこそスタックオーバーフロー。まもなく、[About]ページ、およびMCVE([MCVE])の作成方法に関するページをお読みください。あなたのコードは 'i'や' j'や 'n'の宣言を表示しません。それは 'gets()'を使っています - [なぜ 'gets()'が使いすぎるのか]を見てください(http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-使用すべきではありません)。今年度は4桁のスペースとヌルターミネーターバイト、またはヌルターミネーターバイトを追加するスペースがありません。それはおそらくあなたのトラブルの原因です。 'day'配列と同様に、設定されていることを表示しません。 –

+0

@JonathanLefflerは年配列を '年[5]'として宣言しました。問題は解決されました。しかし、なぜ日配列ではありませんでしたが、格納するデータのサイズとまったく同じです(2文字私は同じエラーを持って2)としてサイズを与えている。 –

+0

あなたはそれがゼロになっていないことは幸運でした。おそらく、1日の配列には2つの制御文字があります(あるいは、使用されなかったためにオプティマイザによって削除された可能性があります)。昇順のアドレス順の配列は年、日、日付でした。文字列をNULLで終わらせなかったとき、 'printf'は最後に' gets() 'によって挿入されたヌルバイトを見つけるまで続きました。だから、あなたの間違いを簡単に発見できるのは幸運でした。しかし、あなたは無条件に悪い考えである未定義の振舞いを呼び出していました! –

答えて

1

ジョナサンは、scanf()を使用する代わりに使用しないと言ったように、何かについては注意してください。もう一つは、宣言時に常に変数を宣言し、適切な値を割り当てる必要があります(私の考え方)。最後の文字配列では、文字配列の最後であることを示すために、char配列にはヌルターミネータまたは配列末尾に '\ 0'が必要です。いつでも、終了のために1つ以上nullを保持する必要があります。あなたはこのように宣言する必要があります年の例えば

ヌル記号= '\ 0'


のchar年[5]; //終了の年+ 1のための4桁の数字( '\ 0')

は編集済みのコードです。

#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <conio.h> 

int main() 
{ 

char date[11],day[3],year[5]; 
scanf("%s",date); 
int n=strlen(date); 
int j=n-1; 
year[4]='\0'; 
for(int i=3;i>=0;i--) 
{ 
    year[i]=date[j]; 
    j--; 
} 
printf("%s",year); 
getch(); 
} 
+0

'scanf("%s "、日付);'は 'gets()'よりも改善されていません。 'scanf("%10s "、date);またはそれ以上の' fgets(data、sizeof data、stdin) 'を使うことができました。 – chux

関連する問題