main()
{
char *x="girl";
int n,i;
n=strlen(x);
*x=x[n];
for(i=0;i<n;i++)
{
printf("%s \n",x);
x++;
}
}
출력은 무엇입니까?
출력을 설명해주십시오 .......................
O/P는 다음과 같습니다C, 포인터, 문자열
irl
rl
l
main()
{
char *x="girl";
int n,i;
n=strlen(x);
*x=x[n];
for(i=0;i<n;i++)
{
printf("%s \n",x);
x++;
}
}
출력은 무엇입니까?
출력을 설명해주십시오 .......................
O/P는 다음과 같습니다C, 포인터, 문자열
irl
rl
l
다른 사람들이 지적했듯이, 작성된 프로그램에는 정의되지 않은 동작이 있습니다. 당신은 작은 변경을 한 경우
:
char x[] = "girl";
는 나는 설명 할 법적, 가능한 믿습니다. (편집 :. 당신이
printf
을 사용하고 있기 때문에 실제로 문제 그것은
int main()
아직 거기, 당신은
strlen
을 사용하고 있기 때문에 당신은
return 0;
끝에 당신은 또한
#include <string.h>
필요해야하고,
#include <stdio.h>
..)
라인
x[4]
에
*x = x[n];
세트 (즉 *x
) x[0]
(일 '\0'
문자열 종료 될 수 있습니다). 따라서 첫 번째 문자는 문자열 종결 자이므로 인쇄 할 첫 번째 문자열은 빈 문자열입니다. 하위 문자열을 인쇄 문자열을 통해
우리는 다음 루프, 한 번에 하나 개의 문자 : 결과는 정의되지 않은 동작이
irl
rl
l
감사합니다 ... – Adi
동안 DeadMG 말했듯이,의 당신이 char x[] = "girl"
로 X를 선언 가정하자.
당신은 (단어 "여자"의 길이가 4 이후), 당신은 (x[0]
인) *x
에 x[4]
의 값을 할당하지만,이 값이 '\ 0'(null 종결) n
4를 할당
이제 x에서 다음 널 종결 자로 단어를 반복하여 인쇄하지만 처음에는 첫 번째 문자가 널 종결자가되므로 아무 것도 얻지 못합니다. 그 후에 색인을 증가시키는 단어를 인쇄합니다.
g i r l \0
*x = x[4]:
\0 i r l \0
^ ^^^
it1 it2 it3 it4 // << Where does x points to in each iteration of the for loop
코드가 현저하게 의심됩니다. *x=x[n]
리터럴 "소녀"를 덮어 쓰려고 시도하면 플랫폼과 컴파일러에 따라 효과가 달라질 수 있습니다. 더 정확하게 다음과 같이 선언해야합니다 :
const char *x = "girl";
그런 다음 컴파일하지 않아야합니다.
더 정확하게 그는 문자열을 수정하는 것이 안전해야하며 컴파일러가 검사 한 문자열의 원래의 비 - 가변성을 만들어 전체 프로그램을 중단시키지 않아야합니다. –
응? 컴파일하지 않는 코드를 작성하는 것이 더 정확합니까? –
@ 사이먼 (Simon) : 문자열 리터럴을 수정하는 것을 허용하지 않는다는 점에서 "더 정확한"것입니다. IOW, 컴파일러는 그와 같은 종류의 오류를 잡아낼 것입니다. –
결과 = UB = 정의되지 않음 Behavio (u) r –
'char * x'를'char x []'로 변경하여 정의되지 않은 동작을 피하십시오. – hugomg
@missingno : 코드에 더 많은 UB 문제가 있습니다. 문자열 리터럴을 수정하는 것은 혼자가 아닙니다. – pmg