duddnd904   5년 전

문자열을 입력 받으면 단어를 역순으로 출력하는 프로그램 코드를 보고있습니다.

(i am a boy 입력 -> boyaami 출력)

  1.  21~28줄에 걸쳐 입력받은 문자열에 대해서 마지막 인덱스 부터 접근하여 공백을 만날때마다 그 위치에서 출력하는 식으로 이해했습니다.

    여쭤보고 싶은 점은
    1. %s가 str[i]가 0이되는 지점에서 읽는 것을 멈추는데 왜그런건가요? 원래 성질인가요?
    왜 '0'꼴은 읽어드리지만 그냥 0은 못읽는건가요? 다른 정수들에 대해서도 그런건가요?

    2. str[i+1]은 배열 중 한 인덱스를 의미하는 것인데 이걸 %s로 읽으면 그 위치부터 null문자까지의 문자열을 읽는게 맞나요?   
    비슷한 용례가 있으면 감사하겠습니다 :)

jaehoo1   5년 전

1. %s가 str[i]가 0이되는 지점에서 읽는 것을 멈추는데 왜그런건가요? 원래 성질인가요?
왜 '0'꼴은 읽어드리지만 그냥 0은 못읽는건가요? 다른 정수들에 대해서도 그런건가요?

답변을 드리자면, %s는 문자열, 즉 문자들의 집합을 입/출력 하는 서식입니다.

문자들의 서식을 출력할 때에는, ASCII 코드에 있는 값 대로 출력을 합니다.

printf("%d", '0') → 48 출력     printf("%c", 48) → 0 출력 (이 0은 숫자 0과는 다른 문자 0 입니다)

'0' 은 실제 나타내는 값이 48이고, 실제로 저장되는 값도 48입니다.

ex)

char c;

scanf("%c", &c);

printf("%d", c);

입력 : 0   출력 : 48

문자열을 읽을 때는 null문자 를 만나면 문자열의 끝을 만나서, 읽는 것을 그만둔다고 알고 있을 겁니다.

null문자('\0')의 아스키 코드값은 0입니다.

if('\0'==0)puts("True");     하면 True가 출력되는 것을 볼 수 있습니다.

17번 줄의 str[strlen(str)-1]=0; 은 0을 저장하는게 맞긴 맞지만, 이게 읽을 때는 null문자를 읽게되기 때문에

문자열의 끝을 만났기 때문에, 문자열 출력을 그 자리에서 멈춥니다.

다른 정수에 대해서 그러냐는 것은 아스키 코드표를 참고하면서, 본인이 직접 해보시면 알겁니다.

char str[2]={65, 0};

printf("%s", str);

출력 : A

2. str[i+1]은 배열 중 한 인덱스를 의미하는 것인데 이걸 %s로 읽으면 그 위치부터 null문자까지의 문자열을 읽는게 맞나요?   

무슨 말인지 잘은 이해가 안갑니다만, str에 인덱스 표시를 안한다면, str[0]의 주소값을 의미합니다.

char str[100];

scanf("%s", str);

if(str==&str[0])puts("True");

입력 : 123456     출력 : True

char str[100];

scanf("%s", str);

printf("%s", &str[3]);

입력 : abcde     출력 : de

duddnd904   5년 전

1번은 완벽하게 이해되었습니다. 감사합니다 :)

2번 질문의 의도는 제가 배열의 문자열 출력에 있어서 배열의 한 성분(예컨대, arr[3], arr[5].....)에서 부터 시작하는 것을 처음봐서 
이것이 가능한지, 어떤 메커니즘으로 작동하는지를 여쭌 내용입니다. 항상 printf("%s",arr)식으로 전체 배열에 대한 문자열 출력만 가능한 줄 알고있었습니다. 

댓글을 작성하려면 로그인해야 합니다.