ある文字配列の最後の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
どのような原因と解決方法がありますか?
ようこそスタックオーバーフロー。まもなく、[About]ページ、およびMCVE([MCVE])の作成方法に関するページをお読みください。あなたのコードは 'i'や' j'や 'n'の宣言を表示しません。それは 'gets()'を使っています - [なぜ 'gets()'が使いすぎるのか]を見てください(http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-使用すべきではありません)。今年度は4桁のスペースとヌルターミネーターバイト、またはヌルターミネーターバイトを追加するスペースがありません。それはおそらくあなたのトラブルの原因です。 'day'配列と同様に、設定されていることを表示しません。 –
@JonathanLefflerは年配列を '年[5]'として宣言しました。問題は解決されました。しかし、なぜ日配列ではありませんでしたが、格納するデータのサイズとまったく同じです(2文字私は同じエラーを持って2)としてサイズを与えている。 –
あなたはそれがゼロになっていないことは幸運でした。おそらく、1日の配列には2つの制御文字があります(あるいは、使用されなかったためにオプティマイザによって削除された可能性があります)。昇順のアドレス順の配列は年、日、日付でした。文字列をNULLで終わらせなかったとき、 'printf'は最後に' gets() 'によって挿入されたヌルバイトを見つけるまで続きました。だから、あなたの間違いを簡単に発見できるのは幸運でした。しかし、あなたは無条件に悪い考えである未定義の振舞いを呼び出していました! –