讀古今文學網 > C語言解惑 > 2.7 別混淆字符數組和字符 >

2.7 別混淆字符數組和字符

【例2.9】下面的程序正確嗎?


#include <stdio.h>
void main
()
{
     char st="When you go home
?"
;
     printf
("%s\n"
,st
);          //1
     printf
("%c\n"
,st[5]
);     //2
     printf
("%s\n"
,st[5]
);     //3
}
  

【解答】編譯能通過,但結果不正確。第1條輸出語句中的st代表字符串的首地址,所以能輸出字符串的內容。第2條語句的st[5]代表第6個元素y的地址,所以能正確輸出「y」。第3條輸出語句是錯誤的,因為%s是輸出字符串,要求字符串「you go home?」的首地址。正確的寫法是&st[5]。其實,可以簡單地使用如下語句


printf
(&st[5]
);
  

將這種方法用到程序中。將其改寫如下:


#include <stdio.h>
void main
()
{
       char st="When you go home
?"
;
       printf
("%s\n"
,st
);
       printf
(st
);
       printf
("\n"
); 
       printf
("%c\n"
,st[5]
);
       printf
("%s\n"
,&st[5]
);
       printf
(&st[5]
);
       printf
("\n"
);
}
  

可以對應下面的輸出結果加深對字符串的理解。


When you go home
?
When you go home
?
y
you go home
?
you go home
?
  

當定義字符串


char c="abc"
;
  

時,其實是由c[0]='a',c[1]='b',c[2]='c',c[3]='\0'這4個元素組成。為它分配的長度要增加一位結束符。因此,定義時不能使用


 char c[3]="abc"
;
  

而要使用


char c[4]="abc"
;
  

或者使用


char c="abc"
;
  

【例2.10】在下面的程序中,輸入「You and we」,輸出是輸入的內容嗎?


#include <stdio.h>
void main 
( 
)
{
  char st[32]
;
  scanf
("%s"
,st
);
  printf
(st
);
  printf
("\n"
);
}
  

【解答】不是的。輸出是「You」。scanf語句的讀入是以空格結束的,所以它只取第1個連續字符串作為輸入。要想得到正確的結果,就要放棄scanf函數而改用其他函數。例如,使用gets函數。下面是一個正確的程序。


#include <stdio.h>
void main 
( 
)
{
  char st[32]
;
  printf
("
輸入:"
);
  gets
(st
);
  printf
("
輸出:%s\n"
,st
);
}
  

運行時輸入「You and we」,就能保證輸出「You and we」。