2016-06-28 2 views
0

한 문자 배열의 마지막 4 문자를 다른 배열에 복사하고 싶습니다. 나는 아래에 보여준 것처럼 그것을 시도했다.C에서 하나씩 문자를 복사하는 것은 전체 문자열을 복사하는 것입니다.

{ 
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); 
} 

그러나 두 번째 배열이 작더라도 복사 할 때 전체 문자열과 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- 사용하지 않아야 함). 올해 네 자리 숫자와 널 종결 자 바이트에 충분한 공간을 허용하지 않았으며 널 종결 자 바이트를 추가하지 않았습니다. 그것은 아마도 당신의 문제의 원인 일 것입니다. 'day' 배열과 유사하게, 당신은 설정되는 것을 보여주지 않지만. –

+0

@JonathanLeffler는 year 배열을 'year [5]'로 선언하여 문제를 해결했습니다. 감사합니다.하지만 왜 일 배열이 아니 었는지, 저장하는 데 필요한 데이터의 크기와 정확히 동일합니다 (2 문자를 원합니다. 저장하고 나는 같은 오류가 2)로 크기를 부여했습니다. –

+0

운 좋게도 제로가 아니 었습니다. 기회는 하루 배열에 몇 가지 제어 문자가 있거나 (아마도 사용되지 않았기 때문에 옵티 마이저에 의해 제거되었을 수 있습니다.) 배열의 오름차순 주소 순서는 년, 일, 날짜였습니다. 문자열을 null로 끝내지 않으면'printf'는'gets()'에 의해 삽입 된 null 바이트를 마침내 찾을 때까지 읽기를 계속합니다. 그래서, 여러분의 실수를 쉽게 발견 할 수 있었던 것이 행운이었습니다. 하지만 당신은 무조건 나쁜 생각 인 정의되지 않은 행동을하고있었습니다! –

답변

1

조나단 (Jonathan)은 scanf()를 사용하지 말고 사용하지 않는다고 말하면서 몇 가지 사항에주의하십시오. 두 번째는 선언 할 때마다 항상 변수를 선언하고 적절한 값을 지정해야한다는 것입니다 (제 생각). 그리고 마지막으로 char 배열은 널 종료 자나 배열의 끝에 '\ 0'을 가져야이 장소가 문자열의 끝임을 알 수 있습니다. 해지를 위해 항상 널 대신에 한 곳을 유지해야합니다. 이 같은 선언해야 해, 예를 들어

널 (null) 기호 = '\ 0'

을 :
문자 년 [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

관련 문제