2013-04-26 3 views
0

먼저 char []를 선언하면 sscanf 함수에서 읽지 않습니다.C 선언 순서 오류

char rd[4]; 
char rs[4]; 
char rt[4]; 
sscanf(line, "or $%[^,], $%[^,], $%s", rd, rs, rt); 
printf("RD: %s, RS: %s, RT: %s\n", rd, rs, rt); 

예를 들어, 먼저 rd를 넣고 rd는 읽지 않습니다. 나는 rs를 먼저 넣었고 읽혀지지 않았다.

이것은 내가 읽고있다 문자열은 다음과 같습니다 "또는 $ A0, $의 T4, $ 제로"

사람이 이것을 설명 할 수 있습니까?

+2

''zero ''문자열이'char [4]'에 들어 가지 않아서,'char [5]'가 필요합니다. 0 종결자는 분명히 여기서'rd'의 첫 번째 바이트에 저장됩니다. –

+1

그냥'sscanf'에게 no라고 말하십시오; [this] (http://stackoverflow.com/questions/2430303/disadvantages-of-scanf)와 같은 수많은 참고 자료. –

답변

0

문자 배열이 읽는 모든 데이터를 저장할 정도로 크지 않기 때문에 거의 확실합니다. 특히 문자열 "zero" (끝 부분이 \0 인 경우)은 4 바이트가 아니라 5 바이트가 필요합니다. 배열의 끝을 넘어서 쓰는 것은 정의되지 않은 동작이며 일단 그렇게하면 모든 동작 보장이 사라집니다. 예를 들어

, 당신은 선언 할 때 : 당신이이 같은 메모리 배치 할 수있다

char rd[4]; 
char rs[4]; 
char rt[4]; 

:

rt: [1] [2] [3] rs: [1] [2] [3] rd: [1] [2] [3] 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| | | | | | | | | | | | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 

을하고 명령 실행 :

sscanf ("or $a0, $t4, $zero", "or $%[^,], $%[^,], $%s", rd, rs, rt); 

원인 chu 의 최종 상황의 결과로

rt: [1] [2] [3] rd: [1] [2] [3] rs: [1] [2] [3] 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| | | | | a | 0 | . | | | | | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| | | | | | | | | t | 4 | . | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| z | e | r | o | . | | | | | | | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 

: 메모리의 NKS는 .\0를 나타냅니다, 쓰기가 다음과 같은 메모리의 결과로 표시된 순서대로 채울 당신이이 볼 수

rt: [1] [2] [3] rd: [1] [2] [3] rs: [1] [2] [3] 
+---+---+---+---+---+---+---+---+---+---+---+---+ 
| z | e | r | o | . | 0 | . | | t | 4 | . | | 
+---+---+---+---+---+---+---+---+---+---+---+---+ 

rdrt으로 덮어 쓰면 아무 것도 보이지 않는 것처럼 보입니다. rd.

위의 단어 may의 사용에 유의하십시오. 메모리가 이런 식으로 배치 될 것이라는 보장은 없으며 결과가 왜 발생하는지에 대한 하나의 가능한 설명 일뿐입니다.

결론은 사용자가 허용 한 것보다 더 많은 데이터를 어레이로 읽지 않아야한다는 것입니다.

이 문제를 해결하는 방법에 관해서는

, 같은 this one 같은 C에서 입력을 받고 수많은 강력한 방법이있다.