字符串和格式化輸入輸出


一;字符串簡介

  字符串(character string)是一個或多個字符的序列。比如:“i am a teacher!” 注意:雙引號不是字符串的一部分,它的作用是告知編譯器它包含起來的內容是字符串。對比單引號用於標識單個字符。

二;char類型數組和null字符

  C語言當中,沒有專門存儲字符串的變量類型,字符串都被存儲在char類型的數組當中(數組由聯系的存儲單元組成,同類型數據元素的有序序列)且使用空字符“\0”來標識字符串的結束。詳細如下圖:

注意:字符串和字符是不同的。比如:字符串常量“A”和字符常量‘A’它們的區別在於‘A’是基本類型(char),"A"是派生類型(char 數組)。另外區別“A”實際上是由兩個字符組成的:‘A’+控制符。

三;常量和C預處理量

  3.1;符號常量(明示常量)是在編譯程序時,程序中所有的符號常量被替換為定義的初始值,且不會被程序無意間改變值。同時也是方便日后程序的修改。(預編譯器可以使用#include包含其他文件的信息同時也可以用來定義常量)

  3.2;定義符號常量格式:#define NAME value (詳細參考下面例子)

#include <stdio.h>
#define PI 3.14159     //定義一個PI字符常量
int main(void)
{
    float area, circum, radius;

    printf("What is the redius of your pizza?\n")
    scanf("%f",&radius);
    area = PI * radius * radius;   //使用字符常量,編譯過程中自動轉換為數值3.14159
    circum = 2.0 * PI * radius;
    printf("Your basic pizza parameters are as follows:\n");
    printf("circumference = %1.2f, area = %1.2f\n",circum,area);

    return 0;
}

四;connst限定符

  const關鍵字是C90標准新增的,作用是限定一個變量為只讀。舉例:

const int a = 12;      //a變量在程序中不可更改為只讀。具體以后詳細講解:

五;明示常量

  明示常量相當於符號常量。常見使用如下:

  頭文件limits.h包含明示常量如下:

明示常量 含義
CHAR_BIT char類型的位數
CHAR_MAX char類型的最大值
CHAR_MIN char類型的最小值
SCHAR_MAX signned char 類型的最大值
SCHAR_MIN signned char 類型的最小值
UCHAR_MAX unsigned char 類型的最大值
SHRT_MAX short類型的最大值
SHRT_MINN short類型的最小值
USHRT_MAX unsigned char 類型的最大值
INT_MAX

int類型的最大值

INT_MIN int類型的最小值
UINT_MAX unsigned int 的最大值
LONG_MAX long類型的最大值
LONG_MIN long類型的最小值
ULONG_MAX unsigned long 類型的最大值
LLONG_MAX long long 類型的最大值
LLONG_MIN long long 類型的最小值
ULLONG_MAX unsigned long log 類型的最大值

  頭文件float.h包含明示常量如下:

明示常量 含義
FLT_MANT_DIG float類型的尾數位置
FLT_DIG float類型的最少有效數字位數(十進制)
FLT_MIN_10_EXP 帶全部有效數字的float類型的最小負指數(以10為底)
FLT_MAX_10_EXP float類型的最大正指數(以10為底)
FLT_MIN 保留全部精度的float類型最小正數
FLT_MAX float類型的最大正數
FLT_EPSILON 1.00和比1.00大的最小float類型值之間的差值

 

六;printf()函數

  6.1;printf()函數為輸出函數,且和scanf()函數一起稱之為輸入/輸出函數。

  printf()函數格式為:printf(格式字符串,待打印項目1,待打印項目2,。。。) 其中“格式字符串”是雙引號括起來的內容,使用“轉換說明”符號來指定“待打印項目”值代入的位置以及數據轉換可顯示的形式。“待打印項目”可以是常量,變量,表達式。舉例:

#include <stdio.h>
#define PI 3.14159
int main(void)
{
    int number = 7;
    printf("The number is %d\n",number);   //%d占位符,轉換說明:有符號的十進制整數

    return 0;
}

注意:格式字符串中的轉換說明一定要與后面的每個項目匹配。

  6.2;轉換說明把以二進制格式存儲在計算機中的值轉換成一系列字符(字符串)以便於顯示。printf()函數常見轉換說明符號如下圖:

轉換說明 輸出
%a 浮點數,十六進制數和p計數法(C99/C11)
%A 浮點數,十六進制數和p計數法(C99/C11)
%c 單個字符
%d 有符號十進制整數
%e 浮點數,e計數法
%E 浮點數,e計數法
%f 浮點是,十進制計數法
%g 根據值的不同,自動選擇%f,%e,%e格式用於指數小於-4或者大於或等於精度時
%G 根據值的不同,自動選擇%f,%e,%e格式用於指數小於-4或者大於或等於精度時
%i 有符號實際值整數
%o 無符號八進制整數
%p 指針
%s 字符串
%u 無符號十進制整數
%x 無符號十進制整數,使用十六進制數0f
%X 無符號十進制整數,使用十六進制數0F
%% 打印一個百分號

  6.3;printf()轉換說明修飾符

    在%和轉換字符之間插入修飾符可修飾基本的轉換說明,比如:%4d 表示十進制整數位,保留4個最小字段寬度。如下表顯示基本使用修飾符:

修飾符 含義
標記 標記包含5種類,詳細查看下文標記表格。舉例:“%-10d”
數字

最小字段寬度

注意:如果該字段不能容納帶打印的數字或字符串,系統默認會使用更寬的字段。

舉例:“%4d”

.數字

精度

對於%e,%E,%f,轉換,表示小數點右邊數字的位數

對於%g,%G 表示有效數字最大的位數

%s 表示待打印字符的最大數量

整型轉換,表示待打印數字的最小位數

舉例:“%5.2f”打印一個浮點數,字段寬度5字符,其中小數點后面兩位數字

h

和整數轉換說明一起使用,表示short int 或unnsigned short int 類型的值

舉例:“%hu”

hh

和整數轉換說明一起使用,表示signed char 或者 unsigned char 類型的值

舉例:“%hhu”

j

和整型轉換說明一起使用,表示inntmax_t或uintmax_t類型的值、

舉例:“%jd”

l

和整型轉換說明一起使用,表示long int 或 unsigned long int 類型的值

舉例:“%ld”

ll

和整型轉換說明一起使用,表示long long int 或 unsigned long long int 類型的值

舉例:“%lld”,"%8lld"

L

和浮點轉換說明一起使用,表示long double 類型的值

舉例:“%Ld”,"%10.4Le"

t

和整型轉換說明一起使用,表示ptrdiff_t類型的值。ptrdiff_t是兩個指針差值的類型

舉例:“%td”,"%19.3ti"

z

和整型轉換說明一起使用,表示size_t 類型的值。size_t是sizeof返回的類型

舉例:“%zd”,"%12zd"

    printf()中的標記,詳細查看如下表格:

標記 含義
-

待打印項左對齊。即,從字段的左側開始打印該項

舉例:“%-20s”

+

有符號值為正,則在值前面顯示加號;為負,則在前面顯示減號

舉例:“%+6.3f”

空格

有符號值為正,則在值前面顯示前導空格(不顯示任何符號);為負。則在值前面顯示減號

+標記覆蓋一個空格

舉例:“%6.3f”

#

把結果轉換為另一種形式,如果是%o格式,則以0開始;如果是%x 或%X格式,則以0x 或0X開始;對於所有的浮點格式,#保證了即使后面沒有任何數字,也打印一個小數點符號。對於%g和%G格式,#防止結果后面的0被刪除。

舉例:“%#o”

0 對於數值格式,用前導0代替空格填充字段寬度。對於整數格式,如果出現-標記或指定精度,則忽略該標記

    使用修飾符和標記的實例:

  示例一;字段寬度在打印整數時效果。

#include <stdio.h>
#define PAGES 959
int main(void)
{
        printf("*%d*\n",PAGES);
        printf("*%2d*\n",PAGES); //字段寬度為3位數字,規定輸出2個字段寬度。所以默認自動擴大以符合整數成都
        printf("*%10d*\n",PAGES);
        printf("*%-10d*\n",PAGES);

        return 0;
}

  運行結果如圖:

  示例二;浮點型修飾符組合

  。。。。。。

   7.4;printf()的返回值

    printf()返回值時返回打印字符的個數。

七;scanf()函數

  scanf()函數用來輸入數據,因為鍵盤輸入都是文本(字母,數字,標點符號)。比如我要輸入整數2019,就要輸入字符2,0,1,9 。但是計算機存儲的是數值而不是字符串,所以需要通過scanf()函數將字符依次轉換成數值。而printf()函數行為相反。

  scanf()函數使用格式:scanf(“格式字符串”,指向變量指針)

  格式字符串:用來表明字符輸入流的目標數據類型

  指向變量指針:1;如果讀取基本變量類型的值,則變量名稱前加一個&。2;如果是字符串讀入字符數組,不要使用&

使用舉例:

#include <stdio.h>
int main(void)
{
        int age;
        float assets;
        char pet[30];

        printf("Enter your age, assets, and favorite pet.\n");
        scanf("%d %f",&age,&assets);
        scanf("%s",pet);
        printf("%d $%.2f %s\n",age,assets,pet);
        return 0;
}

演示結果:

  7.1;scanf()函數轉換說明如下表:

轉換說明 含義
%c 把輸入解釋成字符,包括空白
%d 把輸入解釋成有符號十進制整數
%e,%f,%g,%a 把輸入解釋成浮點數
%E,%F,%G,%A 把輸入解釋成浮點數
%i 把輸入解釋成有符號十進制整數
%o 把輸入解釋成有符號八進制整數
%p 把輸入解釋成指針(地址)
%s 把輸入解釋成字符串。從第一個非空白字符開始,到下個空白字符之前的所有字符都是輸入
%u 把輸入解釋成無符號十進制整數
%x,%X 把輸入解釋成有符號十六進制整數

  7.2;scanf()轉換說明中的修飾符如下表:

轉換說明 含義
* 抑制賦值,詳細查看下文“printf()和scanf()的*修飾符”
數字

最大字段寬度。輸入達到最大字段寬度處,或者第一次遇到空白字符停止

舉例:“%10s”

hh

把整數作為signed char 或unsigned char 類型讀取

舉例:“%hhd”

ll

把整數作為long long 或 unsigned long long 類型讀取

舉例:“%lld”

j

在整型轉換說明后面時,表明使用intmax_t 或uintmax_t類型

舉例:“%jd”

z

在整型轉換說明后面時,表明使用sizeof的返回類型

t 在整型轉換說明后面時,表明使用表示兩個指針差值的類型
h,l,L  

八;printf()和scanf()的*修飾符

  如果我們不希望預先定義字段寬度,希望通過程序來指定。那么我們可以使用*來代替字段寬度,但是還是需要使用一個參數來告訴函數具體的字段寬度是多少。舉例如下:

#include <stdio.h>
int main(void)
{
    unsigned width, precision;
    int number = 256;
    double weight = 242.5;

    printf("Enter a field width:\n");
    scanf("%d",&width)
    printf("The number is :%*d:\n",width,number);
    printf("Now enter a width and a precision:\n");
    scanf("%d %d",&width,&precision);
    printf("weight = %*.*f\n",width,precision,weight); //"%*.*f"中兩個*分別被width,precision參數代替
    printf("Done!\n");

    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM