printf("#!@#test"); 의 의미...???

불량청년의 이미지

printf("#!@#test");

이렇게 하면 아무것도 안나오는데... 위의 기호들은

왜 안나오는지 궁금하네요. 무슨 의미라도 있는건지...

왜 이럴까요? 출력시킬 수 있는 방법은 없을까요?

gcc 버젼은 2.95.4 입니다. 파란R2를 깔아서 쓰고 있고요.

partout의 이미지

이상하네요.. 안 되다니...

printf("#!@#test\n");

이라고 한번 해 보시죠.

어찌나 졸린지..~~

맹고이의 이미지

혹시.. 실행파일이름을 test라 해놓고
./test가 아니라 test 로 실행하신건 아닌지..
제가 몇번 그래봐서 적어봅니다.. :oops:
어딘가에서 읽었는데 안좋은 습관이라네요 8)

new5244의 이미지

잘찍히는데요...

Redhat 7.3 gcc 2.96 씁니다.

from saibi

bucketquai의 이미지

얼마전에
printf("어쩌구");
는 아무것도 안나오고
printf("%s", "어쩌구");
를 해야만 나오는걸 봤었는데 gcc 버전을 까먹었군요 - -;
gcc 홈에서 확인을 좀 해봐야겠네요

ps. printf("어쩌구\n"); 는 출력이 나왔던것 같네요 @@

B00m의 이미지

아마 \n 을 안해서 그럴겁니다..

gcc 버전 문제는 아니구 쉘에 따라서 \n 안하면 화면에 출력이 안나오는 경우가 있는것 같더군요..

버그소년의 이미지

음..

갑자기

"Hello World!"가 대단하게 느껴지네요.. ^^;

그냥 참고삼아서리... #은 %뒤에서는 의미를 가집니다.

접두사라고 하나요?

예를 들어

int i = 10
printf ("%#x", i );
printf ("%#X", i );

이렇게 하면

0xa
0XA

이렇게 접두사가 붙어서 출력됩니당...

가끔은 밥을 굶어도 살 수 있다.

sunyzero의 이미지

#의 여러가지 사용법은 knr 에 아마 나오죠? 잘 안쓰이는 C의 어두운 면이라고 해야 하나? 하여간 재밌는거 많죠. #, ## 도 있고...

========================================
* The truth will set you free.

sylphong의 이미지

printf("#!@#test\n");
이렇게 해주시던가...
아니면 아래처럼 처리해주시면 잘나옵니다..
printf("#!@#test");
fflush(stdout);

ksil의 이미지

printf에서 \n은 행을 바꾸는것과 동시에 flush의 의미를 가집니다.

아마도 안나온것이 아니라 가려져 안보인것이 아닐까 하네요

즉 실행후 문자는 찍혔는데 행이 안바뀌어 쉘의 값들(현재 디레토리라던지 하는것들)이 처음부터 덮어써버려 안보였겠지요...

partout의 이미지

맹고이 wrote:
혹시.. 실행파일이름을 test라 해놓고
./test가 아니라 test 로 실행하신건 아닌지..
제가 몇번 그래봐서 적어봅니다..
어딘가에서 읽었는데 안좋은 습관이라네요

안좋은 습관이라기 보다는...

which test 라고 쳐 보시면 알겠지만, /usr/bin 아래 test라는 이름의 실행파일이
이미 있습니다. 쉘에서 파일 타입이나 변수를 비교할 때 등에 사용되는 명령어입니다.

왜 스크립트들을 열어 보면 ..,
if [ 조건절 ]; then ..
같은 구문이 자주 보이죠?

이것이
if test 조건절; then ...
과 동일한 의미입니다.

어찌나 졸린지..~~

맹고이의 이미지

제말이 그말이었는데..
이미 /usr/bin 에 test란 실행파일이 이미 있어서
test란 실행파일을 만들면 헷갈릴수도 있다는..
혹시나 $PATH에 . 이 들어있다던지..
머 이렇게 쓰는사람은 별로 없겠지만..

보통 테스트한다고 간단한거 짤때 test.c라고
짜고 test로 만들지 않나요.. (저만 그런건지도 모르지요;; )
그래서 안좋은 습관이라고 말했던겁니다.. :oops:

ㅡ,.ㅡ;;의 이미지

잘만나오는데 왜 안나온다고 하지?????

[kkk@localhost test_src]$ cat printf_err.c
#include <stdio.h>

int main( void )
{

printf("#!@#test");
return 0;
}
[kkk@localhost test_src]$ ./a.out
#!@#test[kkk@localhost test_src]$

위에보듯이.. 잘만나오는데..
뒤에 \n 등을붙여야출력이 된다니.......흠..ㅡㅡ;; 그런게 있었나?

C 언어 12년째 하면서 난왜 한번도 그런오류가 없었을까??..
아마도 제생각엔 \n 안붙였다고 출력안되는 컴푸터는 .. 뽀사야 됩니다...


----------------------------------------------------------------------------

partout의 이미지

맹고이 wrote:
제말이 그말이었는데..
이미 /usr/bin 에 test란 실행파일이 이미 있어서
test란 실행파일을 만들면 헷갈릴수도 있다는..
혹시나 $PATH에 . 이 들어있다던지..
머 이렇게 쓰는사람은 별로 없겠지만..

보통 테스트한다고 간단한거 짤때 test.c라고
짜고 test로 만들지 않나요.. (저만 그런건지도 모르지요;; )
그래서 안좋은 습관이라고 말했던겁니다..

아.. 죄송...
앞에 올리신 글에 약간의 설명을 덧붙인다는 게... 좀 서툴렀던 모양입니다.
사실 저도 예전에 실행 파일을 test로 만들어서는, 왜 결과가 나오지 않는지
의아해 했던 적이 있었습니다. 지금도 마음이 급하면 그런 실수를 한다는 ... --

어찌나 졸린지..~~

garuna의 이미지

"\n" 이 없다고 앞에 문자열들 까지도 출력을 안한다는 말은 처음 듣습니다...

sylphong의 이미지

stdout,stdin은 원래 버퍼링됩니다..
stdout의 경우 \n을 안붙여도 버퍼이상의 크기가 들어오면 자동으로 출력해줍니다..다만 그이하의 크기가 들어오면 버퍼시켜뒀다가 나중에 한꺼번에 출력합니다..그래서 제대로 안나온거죠..물론 버퍼크기야 컴터마다 다를수있으니 어떤컴에서는 출력이 잘되고 어떤컴에선 잘안되는 경우가 있겠지요..
이땐 \n을 붙여서 버퍼를 비워주시던가..fflush로 강제로 비워주면 출력이 잘되겠죠...

ㅡ,.ㅡ;;의 이미지

likesylph wrote:
stdout,stdin은 원래 버퍼링됩니다..
stdout의 경우 \n을 안붙여도 버퍼이상의 크기가 들어오면 자동으로 출력해줍니다..다만 그이하의 크기가 들어오면 버퍼시켜뒀다가 나중에 한꺼번에 출력합니다..그래서 제대로 안나온거죠..물론 버퍼크기야 컴터마다 다를수있으니 어떤컴에서는 출력이 잘되고 어떤컴에선 잘안되는 경우가 있겠지요..
이땐 \n을 붙여서 버퍼를 비워주시던가..fflush로 강제로 비워주면 출력이 잘되겠죠...

버퍼링되는줄은알죠..
\n 을 안붙인다고 출력이 안되다니요..
도데체 그런 컴파일러는 어디꺼죠?
만일 그런것이 있다면.. 그건 버그라고 봐야합니다.

버퍼링된다하더라도 프로그램이 이미종료한상태에서 출력이 안되고 있다는건 말이 안되죠..


----------------------------------------------------------------------------

stoneshim의 이미지

Quote:
버퍼링된다하더라도 프로그램이 이미종료한상태에서 출력이 안되고 있다는건 말이 안되죠..

네.. 맞습니다.
문제는 shell이 아닐까 싶군요.
아마도 출력은 되었을텐데 shell의 prompt에 가려서 안보이는 것으로 판단되는 경우가 있었습니다.

Quote:
stdout의 경우 \n을 안붙여도 버퍼이상의 크기가 들어오면 자동으로 출력해줍니다

제가 아는 한에서 첨언하면 stdout이 terminal과 연결된 경우에만 line buffering을 하는것으로 알고 있습니다.
아시겠지만, 예를들어 fork 후 dup2 으로 child의 stdout을 parent의 pipe와 연결시키는 경우에는 line buffering이 안되겠지요.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

sangwoo의 이미지

stoneshim wrote:
Quote:
버퍼링된다하더라도 프로그램이 이미종료한상태에서 출력이 안되고 있다는건 말이 안되죠..

네.. 맞습니다.
문제는 shell이 아닐까 싶군요.
아마도 출력은 되었을텐데 shell의 prompt에 가려서 안보이는 것으로 판단되는 경우가 있었습니다.

셸과 터미널의 특성과 관련이 있는 것 같습니다.
제 시스템에서는 (FreeBSD-current, GCC 3.2.2) bash일 때만
이런 현상이 일어나네요. csh이랑 bourne shell은 제대로 보입니다.
아무래도 bash는 프롬프트를 그 줄의 처음부터 쓰도록 구현되어 있는것
같습니다. bash에서 export PS1='$ ' 등으로 프롬프트를 짧게 만든 뒤에
다시한번 실행해 보세요.
PS. printf문 내부의 출력문을 길게 해도 되겠군요.. :oops:

----
Let's shut up and code.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.