2009-06-04 7 views
1

char first [10];fscanf - 너무 긴 문자열 사용

초 [10];

fscanf (fr, "% s % s \ n", first, second); 첫 번째 문자열이 너무 길 때합니까?

malloc없이 char * first를 사용할 수 있습니까? 포인터가 문자열에 표시됩니까?

답변

3

너비 (예 : "% 9s")를 사용하여 문자열의 크기를 제한 할 수 있습니다. 예를 들어 Microsoft's documentation을 참조하십시오.

포인터를 아무 것도 초기화하지 않고 사용하면 프로그램을 중단 시키거나 다른 방식으로 잘못 처리 할 수 ​​있습니다. 첫 번째 문자열이 너무 긴 경우

+0

그러나 나는 10보다 작은 문자열을 가질 수 있습니다.이 경우에는 모든 것을 얻지 못할 것입니다. – feiroox

+1

문서에서 : 공백 문자 (공백, 탭 또는 줄 바꿈) 또는 지정된 형식에 따라 변환 할 수없는 문자가 너비에 도달하기 전에 발생하는 경우 너비보다 적은 문자가 읽힐 수 있습니다. " –

+1

한 가지 더 - fscanf에 주어진 폭은 널 종결자를 허용하기 위해 문자열의 크기보다 하나 작아야합니다. 나는 그 모범을 새롭게 할 것이다. –

1

, 당신은 당신이 malloc을 사용하지 않는 경우, 그때는 쓰레기 메모리를 가리키는 것, 질문의 두 번째 부분에 대한 buffer overflow.

으로의 문제로 실행합니다. 그 문자열이 잠시 동안 그곳에 머물러있을 수는 있지만 보장되지는 않습니다. 만약 그 메모리 세그먼트가 다른 것에 의해 사용된다면 당신은 문자열을 잃을 것입니다.

2

glibc를 사용하는 경우 두 가지 문제를 한 번에 해결할 수 있습니다. %as 형식 지정자를 사용하십시오.

콘텐츠를 저장할만큼 큰 문자열이 자동으로 할당됩니다. 이처럼

:

char *first, *second; 

scanf(fp, "%as %as\n", first, second); 

참고 : 이것은 GNU 확장이다!

+0

안녕하세요. 그것은 창문 아래에 안타깝구나 :) – feiroox

관련 문제