文章程式碼顯示

2018年2月4日 星期日

《筆記》C語言 - 06_補充1:字元陣列與字串、字串轉數字、字元轉數字、數字轉字串(格式化字串)

註 : 此部分有牽扯到 "指標" ,若有似懂非懂之處可先往後參閱指標章節後,再回頭過來看這部分

字元陣列(字串)宣告

字串的宣告使用雙引號將其包裹,其等效的宣告方式為每一個字元的組成再加上空白字元 NULL ( 也就是 '\0' )  的陣列

一種更簡便的宣告方式為使用指標變數(關於指標將於後續文章中敘述)的方式進行宣告,其指向存放在記憶體中某個位置的字串

第 7 與 8 行的宣告方式等價,其 sizeof 的結果皆為 4 bytes 的原因在於它回傳的是 "指標變數的長度" 恆為 4 bytes 。

#include "stdio.h"

int main(void) {

 const char color[] = "blue";
 const char color1[] = { 'b', 'l' , 'u' , 'e' , '\0' };
 const char* color2 = "orange"; //以指標變數來宣告一個字串
 const char  *color3 = "white"; //以指標變數來宣告一個字串

 printf("%s,%d\n", color, sizeof(color));
 printf("%s,%d\n", color1, sizeof(color1));
 printf("%s,%d\n", color2, sizeof(color2));
 printf("%s,%d\n", color3, sizeof(color3));

 return 0;
}



回顧前述可知
字串在宣告的時候可以指定為一個字元陣列 char name[] ;或一個型別為 char* 的指標變數


注意:若嘗試列印出一個不具有空白字元 '\0' 的字串會導致錯誤(當機)

也就是說欲使用 printf 函數列印出一個字串,則該字串的最後一個字元必定(須)為空白字元(或稱結束字元 NULL) '\0'

我們可以用 isprint 函數來檢視這個字元陣列是否含有空白字元(是否符合身為字串的條件)

atoi 將字串轉為 int 型態的數字

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 將字串 nPtr 轉換成 int 型態的數字 */
// 使用方法為 int Number = atoi( const char *nPtr )

 const char* string = "-459";

 printf("%d", atoi(string) );

 return 0;
}



atof 將字串轉為 double 型態的數字

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 將字串 nPtr 轉換成 double 型態的數字 */
// 使用方法為 double Number = atof( const char *nPtr )

 const char* string = "533.79";

 printf("%.2f", atof(string) );

 return 0;
}



sprintf 整數、浮點數轉格式化字串。若成功則回傳字元數量

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 整數、浮點數轉格式化字串。若成功則回傳字元數量(有需要的話) */
// 使用方法為 int Number = sprintf( char *s, const char *format, ...);

 char string[80]; 
 int x = 46;
 float y = 124.44;

 sprintf( string, "x = %d, y = %.2f", x, y);

 printf("%s\n", string);

 return 0;
}



補充 :

putchar 印出某個字元。並將此字元以 int 型態回傳

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 印出存放在 c 的字元。並將此字元以 int 型態回傳(也就是 字元轉整數) */
// 使用方法為 int Number = putchar( const char c );

 const char CHAR = 'A';
 int CHAR_in_int;

 CHAR_in_int = putchar(CHAR); // 呼叫 putchar 的同時會印出字元
 printf("\n%d",CHAR_in_int); // 印出來的數值為 ASCII 字元對應的十進制值

 return 0;
}



getchar 從鍵盤讀入"一個字元",並轉換為 int 型態回傳

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 從鍵盤讀入"一個字元",並轉換為 int 型態回傳 */
// 使用方法為 int Number = getchar( void );

 int INPUT = getchar();
 printf("%d,%c", INPUT, INPUT); // 印出來的數值為 ASCII 字元對應的十進制值


 return 0;
}


getchar 不斷讀入字元直到讀取到換行字元 '\n' (也就是Enter),再依序列印各個字元的 int 值

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 從鍵盤讀入"一個字元",並轉換為 int 型態回傳 */
// 使用方法為 int Number = getchar( void );

 int INPUT[10];
 int i = 0;

 while( (INPUT[i] = getchar()) != '\n' ){
  i++;
 }

 for ( int j = 0; INPUT[j] != '\n'; j++ )
  printf("%d\n", INPUT[j]); // 印出來的數值為 ASCII 字元對應的十進制值


 return 0;
}



puts 印出某個字串並且自動加入換行字元\n 。若成功則回傳一個非零的整數

#include "stdio.h"
#include "stdlib.h"

int main(void) {

/* 從鍵盤讀入"一個字元",並轉換為 int 型態回傳 */
// 使用方法為 int Number =int getchar( void );
/* 印出字串 s 並且會自動加入換行字元\n 。若成功則回傳一個非零的整數 */
// 使用方法為 int Number =int puts( char* s);

 char INPUT[20];
 int i = 0;
 char c;

 while ( (INPUT[i] = getchar()) != '\n' ){
  i++;
 }

 INPUT[i] = '\0'; //手動在最後的地方加入 NULL 字元('\0')

 puts("不用自己加入換行字元");
 puts(INPUT); //只能用來輸出字串,沒有printf格式化輸出的功能

 return 0;
}



↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引