20160124.CCPP詳解體系(0003天)

尹成發表於2016-02-16

程式片段(01):HelloCGI.c
內容概要:CGI_HelloWorld

#include <stdio.h>

//01.CGI程式的編寫規範
//  (1).HTML文字格式宣告後面必須具備兩個換行符
//  (2).不允許使用system();指令進行執行
int main(void)
{
    printf("Content-Type:text/html \n\n");//宣告CGI檔案在伺服器當中以HTML語言格式進行解析
    printf("您好!天朝! \n");
    printf("<br />您不好!");

    //system("pause");
    return 1;
}

程式片段(02):printf.c
內容概要:printf();詳解

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.printf();&sprintf();&fprintf();格式控制字串詳解:
//  (1).格式控制字串的組成:
//      普通字串+格式控制符
//  (2).常見的格式控制字元:
//      %f-->%lf-->%llf-->%e-->%g
//      %d/%i-->%ld-->%lld-->%u
//      %c-->%s
//  (3).格式控制字元只能對目標字串進行左擷取,不能
//      實現對目標字串的右擷取操作(無論是使用正負號)
//  (4).格式控制字元當中的點兒號(.)使用說明:
//      .號用於字串對映,用於擷取多少個字元(只能左擷取)
//      .號用於實數對映,用於表示保留多少位小數
//      [注意:float型別的有效數字位數為6,7位,double型別的有效數字位數為22,23位]
//  (5 ).不同printf();函式的使用差別:
//      printf();-->列印到命令列|控制檯|螢幕
//      sprintf();-->列印到字串,常常用於待使用字串的組裝
//      fprintf();-->列印到檔案
int main01(void)
{
    char inputstr[100] = { 0 };
    scanf("%s", inputstr);//輸入,給字串inputstr進行賦值操作
    char totalstr[100] = { 0 };
    sprintf(totalstr, "color %-.2s", inputstr);//字串格式化列印,列印到目標字串當中,將整數,實數,字串整個到另外一個字串當中
    system(totalstr);

    system("pause");

    //printf();-->sprintf();-->fprintf();
    return 1;
}

//01.凡是使用printf();&sprintf();&fprintf();函式列印的結果都是字串:
//  (1).最終組裝的列印結果就是字串形式
//  (2).printf();函式系列說明:
//      printf();輸出到命令列|控制檯|螢幕|網頁
//      sprintf();輸出到字串
//      fprintf();輸出到檔案
int main02(void)
{
    printf("Hello World!!! \n");//列印的最終結果是字串
    printf("a = %d, str = %s \n", 10, "12345abc");//輸出到命令列(網頁),字串,檔案
    printf("c = %d", 10);

    system("pause");
    return 1;
}

//01.格式控制字元詳細說明:
//  (1).正負號(+|-):
//      正號(+):表明右對齊,預設右對齊,對映字串對齊方式
//  (2).是否是8進位制形式資料:
//      是否指定填充0,預設填充空格,指定填充0
//  (3).有效整數部分指定列印的總體寬度
//      總體寬度大於實際寬度:
//          採取填充方式
//      總體寬度小於實際寬度:
//          顯示實際寬度
//  (4).格式控制字元的擷取效果體現:
//      1).只能體現於實數型別對映以及字串形式的對映
//          針對於實數型別:體現意義為保留多少位小數(四捨五入)
//          針對於字串型:擷取多少個字元進行對映
//      2).擷取效果只能是從左往右進行擷取(無論正負號)
//  (5).點號的作用:
//      針對於實數型別:保留多少位小數(四捨五入)
//      針對於字串型:擷取多少個字元進行對映
int main03(void)
{
    printf("%d \n", 10);//有多寬分配多寬
    printf("%10d \n", 10);//總體寬度為10
    printf("%010d \n", 10);//右對齊,總體寬度為10,空餘(左位置)指定填充(零)
    printf("%-10d \n", 10);//左對齊,總體寬度為10,空餘(右位置)預設填充(空格)
    printf("%3d \n", 12345);//m整數,大於實際寬度,填充零(指定)或者空格(預設),否則無效

    system("pause");
    return 1;
}

int main04(void)
{
    printf("%.2f \n", 1.2345);//1.23
    printf("%.2f \n", 1.2355);//1.24
    char str[100] = "calc1";
    printf("%.4s", str);//保留小數點後多少位(實數型別資料),擷取多少個字元(字串型別)

    system("pause");
    return 1;
}

//01.int型別所佔用位元組數的特點:
//  (1).int型別佔用位元組數說明
//      16位機器上,int型別和short型別佔用位元組數一致,都是佔用2個位元組
//      32位以上的機器,int型別和long型別所佔用的位元組數一直,都是佔用4個位元組
//      但是,long型別無論是在16位機器還是32位以上的機器當中都是佔用4個位元組
//          所以常常使用long型別以替作int型別的擴充性
//  (2).整數型別的格式控制字元使用特點:
//      int-->%d
//      long-->ld
//      區分機器的特點,機器不同,那麼解析方式不同,所以建議採用ld進行解析,比較正確一些
int main05(void)
{
    long l1 = 12345;
    printf("%d, %ld", l1, l1);

    system("pause");
    return 1;
}

//01.整數的格式控制字元說明:
//  (1).格式控制字元列印說明:
//      %d|%i-->有符號十進位制輸出
//      %u----->無符號十進位制輸出
//      %o----->八進位制整數輸出
//      %u----->十六進位制整數輸出
//  (2).有無符號的說明:
//      只針對於十進位制的整數具備有無符號的說明
int main06(void)
{
    int num = -12345678;

    printf("%d \n", num);//有符號十進位制
    printf("%i \n", num);//有符號十進位制-->%d|%i效果完全一樣
    printf("%u \n", num);//無符號十進位制列印
    printf("%o \n",num);//整數八進位制列印輸出
    printf("%x \n",num);//整數十六進位制輸出

    system("pause");
    return 1;
}

//01.單個字元的輸出特點:
//  將字元按照單個字元進行輸出
//  將字元按照字串進行輸出
int main07(void)
{
    //如何輸出單個字元?
    char ch = 'A';
    putchar(ch);//將字元按照字元進行輸出
    printf("%c", ch);//將字元按照字串進行輸出

    char str[100] = "calc";
    printf("%s", str);//字串輸出

    system("pause");
    return 1;
}

int main08(void)
{
    char str[100] = { 0 };
    //%3c,該格式控制字元的目標是列印3個字元所組成的字串,
    //  總共佔用3個位置,其中單個字元佔用一個位置,另外剩下兩個左位置
    //sprintf(str, "color %c%3c", '4', 'f');//格式化:整數,實數,字串整合到單個字串當中
    //sprintf(str, "color %3c%c", '4', 'f');
    sprintf(str, "color %c%c", '3', 'f');
    system(str);
    printf("%s", str);

    system("pause");
    return 1;
}

//01.格式控制字元的使用特點:
//  (1).格式控制字元針對於字串對映:
//      1).沒有左右對齊概念(正負號+|-)
//      2).只有擷取概念(點兒號.)
//  (2).格式控制字元針對於實數對映:
//      1).有左右對齊概念(正負號+|-)
//      2).有保留多少位小數概念(正負號+|-)
//          四捨五入的性質
int main09(void)
{
    char str[10] = "task";
    char newstr[10] = "123list123";
    printf("%p", newstr);

    char strall[100] = { 0 };
    //1.%s%s進行拼接
    //2.%.5%s擷取,只能從左邊開始進行擷取(起始位置-->非指標操作)
    //3.從某一個地址開始從左往右進行擷取(任意位置--->指標操作)
    //  10代表寬度
    //  負號(-)代表左對齊-->負號針對於字串的擷取無效
    sprintf(strall, "%s%.4s", str, newstr + 3);//字元地址的移動實現跳過某一丟段兒
    system(strall);
    printf("%s", strall);

    system("pause");
    return 1;
}

int main10(void)
{
    double db = 109.7896616253;
    printf("%.10f \n", db);//.10小數點後保留十位小數
    printf("%30.10f \n", db);//總共30位,保留十位小數(實際位數14位),剩餘位數(16位),右對齊(左邊兒補16個空格)
    printf("%-30.10f \n", db);//總共30位,保留十位小數(實際位數14位),剩餘位數(16位),左對齊(右邊兒補16個空格)
    printf("%030.10f \n", db);//總共30位,保留十位小數(實際位數14位),剩餘位數(16位),右對齊(左邊兒補16個零)
    //針對於實數型別右邊兒是否補零卻絕有保留的有效位數
    printf("%-030.10f \n", db);//總共30位,保留十位小數(實際位數14位),剩餘位數(16位),左對齊(右邊兒補16個零)-->

    system("pause");
    return 1;
}

//01.無論是實數還是小數按照%e進行輸出:
//  1.其中保留的都是小數點後六位小數,需要進行四捨五入
//  2.%f進行列印的時候實際上也是進行了四捨五入的
//  3.概念區分:
//      有效數字(精確度)-->保留位數(四捨五入)
int main11(void)
{
    double db = 1045670500000;
    double dbs = 0.0000215001;
    printf("%e \n", db);//
    printf("%e \n", dbs);//指數輸出(實數的輸出格式)
    printf("%.8f", dbs);

    system("pause");
    return 1;
}

//02.用於列印實數的控制字元:
//  %f-->%e-->%g
int main12(void)
{
    //double db = 10456700000000;
    double db = 1.234567;
    printf("%f\n, %e\n, %g", db, db, db);//g自動選擇寬度較短(%f|%e)的一個進行列印

    system("pause");
    return 1;
}

//03.格式控制字元當中沒有%n這個控制字元
int main13(void)
{
    int num = 10;
    //printf("Hello %n china \n", &num);//%n禁用
    printf("num = %d", num);

    system("pause");
}

程式片段(03):main.c
內容概要:特殊格式控制符(printf();函式沒有,scanf();函式有)

#include <stdio.h>
#include <stdlib.h>

//01.%n的使用特點:
//  1.printf();函式沒有%n這個輸出格式控制符
//  2.scanf();函式當中含有%n這個掃描格式控制符,
//    經常用在%s這種格式控制符的後面(緊跟)用於
//    統計資料掃描函式掃描的字元個數
int main01()
{
    int num;
    printf("h%n", &num);
    printf("num=%d", num);

    getchar();
}

程式片段(04):printf.c
內容概要:printf();函式補充

#include <stdio.h>
#include <stdlib.h>

//01.整數變數宣告以及格式控制符使用:
//  (1).整數變數的宣告方式:
//      1).所需描述的整數範圍-->選擇整數宣告關鍵字(char->short->int->long->long long-->long double-->庫擴充套件)
//      2).有符號,無符號-->實際意義-->更大的正整數範圍
//      3).非簡化形式,簡化形式-->軟體工程規範化
//  (2).整數
//      short int-->%hd|%hu
//      int-------->%d|%u
//      long int--->%ld|%lu
//      long long->%lld|%llu
// 注意事項:
//      在16位的機器當中
//          "short int"和int的意義一致
//              "short int" = int
//          "short int"和int的格式控制符意義一致
//              %hd = %d
//      在32位以上的機器當中
//          int和"long int"的意義一致
//          int和"long int"的格式控制符意義一致
//              %d=%ld
int main01(void)
{
    signed short int ssnum1 = 123;
    short int ssnum2 = 123;
    short ssnum3 = 123;
    unsigned short int usnum1 = 65535;
    unsigned short usnum2 = 65535;

    printf("ssnum1 = %hd, ssnum2 = %hd, ssnum3 = %hd, usnum1 = %hu, usnum2  = %hu \n", ssnum1, ssnum2, ssnum3, usnum1, usnum2);

    {
        signed long int slnum1 = 123;
        long int slnum2 = 123;
        long slnum3 = 123;
        unsigned long int ulnum1 = 65535;
        unsigned long ulnum2 = 65535;

        printf("slnum1 = %ld, slnum2 = %ld, slnum3 = %ld, ulnum1 = %lu, ulnum2 = %lu \n", slnum1, slnum2, slnum3, ulnum1, ulnum2);
    }

    printf("sizeof(long long) = %Id, sizeof(long double) = %Id \n", sizeof(long long), sizeof(long double));

    system("pause");
    return 1;
}

//02.整數的常量表現形式(進位制形式)和輸出控制符(進位制形式)
//  (1).整數常量的表現形式(明確進位制):
//      預設:十進位制
//      0開頭: 八進位制
//      0x開頭:十六進位制
//  (2).整數的輸出格式控制符(明確進位制以及以及進位制符號)
//      預設:十進位制
//      %#o:八進位制
//      %#x:十六進位制
int main02(void)
{
    int num = 0127;
    printf("%o \n", num);
    printf("%#o \n", num);

    int data = 0x1234;
    printf("%x \n", data);
    printf("%#x \n", data);//一般情況之下,八進位制和十六進位制的格式控制符都會在中間插入井號"#",以明確的進位制字首輸出

    system("pause");
    return 1;
}

//03.整數和實數的十六進位制輸出方式:
//  整數十六進位制:%#x
//  實數十六進位制:%a-->而且是指數形式
//  注意:科學計數法使用特點
//      十進位制整數的底數是"e",十六進位制整數的底數是"p"
int main03(void)
{
    float fl = (float)10.8;
    double db = 10.9;//long double等價於double
    //printf("sizeof(doube) = %lle, sizeof(long double) = %lle", sizeof(double), sizeof(long double));

    printf("%a \n", fl);//十六進位制的顯示方式
    printf("%a \n", db);
    //底數規律:e表示以10為底數,p表示以16為底數

    system("pause");
    return 1;
}

//04.控制符字母大小寫和轉義字元:
//  通常情況下,只有含有字母的資料才有控制字元的字母大小寫對應
//      正整數的十六進位制控制形式:%#x
//      實數的科學計數法形式:%e
int main04(void)
{
    //printf("%D \n", 10);//%d不可以大寫
    //printf("%O \n", 010);//%o不可以大寫
    //printf("%U \n", 10 );//%u不可以大寫
    printf("%#X \n", 0x10);//x大小寫決定了十六進位制組成元素的大小寫形式
    printf("%E \n", 10000000.0);//有字母輸出的,可以大小寫;沒有字母輸出的一般不可以(%o例外)

    //printf("");需要精確匹配

    printf("\"123\" \n");//轉義字元
    printf("\'123\' \n");
    printf("\n 55%% \n");;

    system("pause");
    return 1;
}

//05.printf();一定要進行匹配,防止資料錯誤
// printf();和逗號表示式的效果結合
//      引數列表多了,按照格式控制符的個數進行對應
//      引數列表少了,按照格式控制符的個數少的地方補上編譯器指定垃圾值(隨機)
int main05(void)
{
    //printf("%d, %d \n", 1, 2, 3);
    //printf("%d, %d, %d, %d \n", 1, 2, 3);
    //printf("%d, %d, %d, %d, %d, %d, %d \n", 1, 2, 3);

    system("pause");
    return 1;
}

//06.將實數按照小數點兒後1位到N位的列印語句:
//  printf("%*.*f \n", i + 2, i, db);
//      第一顆星:
//          最初長度為2(1佔用一個位置+"."佔用一個位置)
//          對應引數i+2,因為i是從1開始的,意味著總寬度從3開始增長,輸出總寬度從2開始變寬
//      第二顆星:
//          保留多少位小數(資料提取精度,不是原始資料精度)
//          保留小數位數從1開始逐漸遞增
//      最後的f:
//          表示原始實數資料
//  *號用於佔位,用於控制實數的輸出形式
int main06(void)
{
    double db = 1.123456789123456789;
    for (int i = 1; i < 20; i++)
    {
        printf("%*.*f \n", i + 2, i, db);//讓小數點位置變動的變化
    }

    system("pause");
    return 1;
}

//07.點兒星(.*)在控制字串(printf();)中的作用:
//  用於實數輸出的時候,表示保留多少位小數(精度)
//  用於字串輸出的時候,提取前多少個字元進行輸出
int main07(void)
{
    char str[100] = "1234567890qwertretrertert";

    for (int i = 1; i < 10; i++)
    {
        printf("%.*s \n", i, str);//控制寬度,小數點兒,變元
    }

    system("pause");
    return 1;
}

程式片段(05):scanf.c
內容概要:scanf();函式詳解

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.scanf();函式掃描輸入事項:
//  格式必須一一匹配:非格式控制符的可見字元必須一一匹配輸入
int main01(void)
{
    int num = 0;

    printf("%p \n", &num);
    scanf("num=%d", &num);//根據地址對變數進行賦值初始化
    printf("num=%d \n", num);

    system("pause");
    return 1;
}

//02.星號(*)用於scanf();和printf();當中的不同特點:
//  用於scanf();當中可以跳過該格式控制符所對應的資料探勘
//  用於printf();當中可以控制總輸出寬度以及以及保留小數位數(精度)
int main02(void)
{
    int a, b = 0, c;

    scanf("a=%d,b=%*d,c=%d", &a, &c);
    a = a + 1;
    //b = b + 10;
    printf("a=%d,b=%d,c=%d readall", a, b, c);

    system("pause");
    return 1;
}

//03.關於scanf("%d%d%d");形式的整數錄入特點分析
//  (1).不可見字元間隔:空格,Tab鍵,回車
//  (2).解析特點:
//      1).scanf();字串緩衝區-->格式字串對映進去
//      2).格式控制符進行資料探勘
//          進行資料型別匹配挖掘
//      3).不可見字元用於發出挖掘指令
int main03(void)
{
    int a, b, c;

    scanf("%d%d%d", &a, &b, &c);
    printf("a = %d, b = %d, c = %d readall \n", a, b, c);

    system("pause");
    return 1;
}

int main04(void)
{
    int num;
    char str[100] = { 0 };

    scanf("%d %s", &num, str);//中間的不可見字元:可以採用空格+Tab鍵+回車發出挖掘指令(從scanf();的控制字串緩衝區當中挖掘)
    printf("num = %d, str = %s", num, str);

    system("pause");
    return 1;
}

程式片段(06):scanf.c
內容概要:scanf();函式擴充

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define 海華中意的身高 172
#define 海華中意的年齡 30

//01.資料探勘含義:
//  1.資料掃描函式從指定字串當中挖掘有用資訊到指標列表當中所指向變數位置
//  2.然後對該指標所指向的變數資料進行各種操作
//02.資料掃描函式使用注意事項:
//  格式控制符所對應的資料左右
//      無論有多少個空格
//      無論有多少個Tab鍵
//      無論有多少個回車
//  都只當做一個空格進行資料掃描處理
int main01(void)
{
    char str[500] = "131610 陳小姐 女    40 165 高中  未婚  朝陽  雙子座 在校學生    普通話 北京  面議元/天   有過幾次    學生伴遊    清純漂亮 自信可愛的我獨在北京上學.在這浪漫的季節偶爾來到這裡尋找我的有緣人.願我們的相聚能留下人生中最美好的回憶!  10:00—23:00     2264938779@qq.com       226493870779";
    int tall;
    int age;

    sscanf(str, "%*d %*s %*s %d %d", &age, &tall);//資料探勘
    //三元運算子-->三元表示式-->當中只有一個分號,那就是結尾的那個用於語句結束的分號";"
    (age >= 海華中意的年齡) && (tall <= 海華中意的身高) ? printf("海華買單 \n") : printf("換下一個 \n");

    system("pause");
    return 1;
}

//01.如果一個字串的前後含有逗號","都會被字串格式控制符識別為字串組成元素:
//  (1).空格形式的不可見字元不會被識別為組成元素
//  (2).數字形式的課件字元不會被識別為組成元素
int main02(void)
{
    //%s,
    char str[500] = "420111197203024016,13600477059,nixiaodong@vip.sina.com";
    //字串不會將逗號當做一個結束

    long long selfid;
    long long mobile;
    char email[100] = { 0 };
    //,|%|#不能作為字串結尾符,需要進行資料掃描挖掘的提前替換

    sscanf(str, "%lld,%lld,%s", &selfid, &mobile, email);//從字串當中進行資料探勘操作
    printf("%lld,%lld,%s \n", selfid, mobile, email);

    system("pause");
    return 1;
}

int main03(void)
{
    char str[500] = "劉海華,420111197203024016,13600477059,niniaodong@vip.sina.com";

    //將障礙字串資料掃描的可見字串組成元素進行替換,以待後期的資料掃描挖掘
    for (int i = 0; i < 500; i++)
    {
        if (str[i] == ',')
        {
            str[i] = ' ';
        }
    }

    char name[100] = { 0 };
    long long selfid;
    long long mobile;
    char email[100] = { 0 };
    sscanf(str, "%s %lld %lld %s", name, &selfid, &mobile, email);
    printf("%s %lld %lld %s \n", name, selfid, mobile, email);

    system("pause");
    return 1;
}

int main04(void)
{
    char str[150] = "530981645----13707700754aini";
    long long QQ;
    char pass[100] = { 0 };

    sscanf(str, "%lld----%s", &QQ, pass);
    printf("QQ = %lld, pass = %s \n", QQ, pass);

    system("pause");
    return 1;
}

程式片段(07):scanf.c
內容概要:scanf();函式加強

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.連續整數的截斷技巧:
//  1.%d控制整數資料掃描挖掘
//  2.中間插入數字(%Nd)表示按照多少個數字組成進行階段挖掘
int main01(void)
{
    int a, b, c, d, e;

    scanf("%3d%3d%3d%3d%3d", &a, &b, &c, &d, &e);//3指定整數的挖掘長度
    printf("a = %d, b= %d, c = %d, d = %d, e = %d \n", a, b, c, d, e);

    system("pause");
    return 1;
}

//02.scanf();函式使用細節說明:
//  1.星號(*)表示跳過該格式控制符所對應的資料掃描
//  2.整數從某個字串資料開始連續掃描多少個資料
int main02(void)
{
    char str1[100] = { 0 };
    char str2[100] = { 0 };

    scanf("%*3s%5s", str1, str2);//固定長度擷取,*忽printf("%s, %s \n", str1, str2);

    system("pause");
    return 1;
}

//03.實數的掃描不可以指定精度,列印可以指定精度
//  掃描的精度指定無效
int main03(void)
{
    float fl = 0;

    scanf("%7f", &fl);//實數不可以指定精度
    printf("fl = %lf \n", fl);

    system("pause");
    return 1;
}

//04.資料掃描函式是用於將資料掃描的指標所指向的變數當中
int main04(void)
{
    int num = 0;
    scanf("%d", &num);//不寫地址符,會將整數的值當做地址進行處理

    system("pause");
    return 1;
}

//05.資料掃描函式要求格式一一對應才行
int main05(void)
{
    int num = 0;

    scanf("#num=%d", &num);//精確匹配,不可以遺漏
    printf("%d", num);

    system("pause");
    return 1;
}

//06.即使是不可見字元也會被當做字元的有效輸入:
//  (1).空格-->Tab鍵-->回車
//  (2).有效輸入就能有效輸出
int main06(void)
{
    char ch1, ch2, ch3;
    scanf("%c%c%c", &ch1, &ch2, &ch3);
    printf("[%c][%c][%c] \n", ch1, ch2, ch3);//回車會被當做一個有效輸入

    system("pause");
    return 1;
}

//07.不同格式控制符所對應的資料掃描結束點不同:
//  字串的輸入格式控制符以:
//      必須以不可見字元空格,Tab鍵,回車進行結束
//  數字的輸入格式控制符:
//      除了數字以外的任何字元
int main07(void)
{
    int num1;
    int num2;
    int num3;
    char str[100];

    scanf("%s%d%d%d", str, &num1, &num2, &num3);
    printf("%s, %d, %d, %d \n", str, num1, num2, num3);//字串必須以空格或者回車結束

    system("pause");
    return 1;
}

int main08(void)
{
    int num1;
    int num2;
    int num3;

    //1.在scanf();函式當中,%%代表一個實際的%
    //2.注意%d%%必須得挨著才行,否則會資料掃描失敗
    //  1).資料掃描和資料匹配是兩碼事兒
    //  2).%%不可以挖掘到整數,所以必須連在一起
    scanf("%d%%%d%d", &num1, &num2, &num3);
    printf("%d,%d,%d \n", num1, num2, num3);

    system("pause");
    return 1;
}

//08.scanf();資料掃描函式使用技巧:
//  在進行使用格式控制符進行字串資料掃描的時候
//  如果在掃描字串格式控制符的末尾新增一個%n
//  就意味著可以統計挖掘到的字串當中的字元個數
int main09(void)
{
    int num1;
    int num2;
    int num3;
    char str[100];
    int n;

    scanf("%s%n%d%d%d", str, &n, &num1, &num2, &num3);//統計字元數量
    printf("%s,%d,%d,%d \n", str, num1, num2, num3);//字串必須空格或者回車以及Tab鍵以作結尾
    printf("n = %d \n", n);

    system("pause");
    return 1;
}

//09.資料掃描函式與正規表示式的結合常常用於對字串
//  的處理
int main10(void)
{
    char str[100];

    //scanf("%s", str);
    //scanf("%[^\n]", str);//只有\n才會被當做為資料掃描挖掘的結尾
    //scanf("[A-Z]%n", str);//只有\n當做結束
    //printf("%s \n", str);

    system("pause");
    return 1;
}

程式片段(08):getchar&gets.c+putchar&puts.c
內容概要:字元字串函式

///getchar&gets.c
#include <stdio.h>
#include <stdlib.h>

//01.gets();函式說明:
//  1.可以直接提取含有空格的字串
//      scanf();預設以空格|Tab鍵|回車結束結束字串掃描
//  2.函式特點是將函式提取到的資料從該函式當中帶出來
//      通做指標進行資料的帶出,跨函式訪問記憶體
//02.putchar();只能輸出單個字元 
//  1.如果是字元常量,就必須採用單個字元的識別符號單引號('')
//  2.putchar('');這樣不行,putchar(' ');putchar('\0')等效
int main01(void)
{
    char str[100];

    //gets(str);//直接輸入初始化一個字串
    //printf("%s", str);
    //system(str);

    char ch = getchar();
    putchar(ch);

    system("pause");
    return 1;
}
///putchar&puts.c
#include <stdio.h>
//#include <stdlib.h>

//01.puts();函式詳解:
//  1.puts();函式末尾會自動攜帶回車,不同於putchar();和printf();
//  2.puts();函式用於字串的原樣輸出
//02.putchar();函式詳解:
//  1.既可以輸出字元常量,也可以輸出字元變數,還可以輸出結果為整數的表示式
//      字元常量:用單引號('')進行標識
//      字元變數:
//      整數表示式:
//  2.大小寫英文字分母的轉換:
//      大寫轉小寫:大寫+32
//      小寫轉大寫:小寫-32
int main01(void)
{
    puts("Content-Type:text/html \n\n");//代表網頁HTML開頭
    puts("1234<br />");//自動換行
    puts("1234<br />");//輸出字串,網頁用<br />
    putchar('A');
    putchar(65);
    putchar('A' + 32);

    //system("pause");
    return 1;
}

程式片段(09):賦值運算子.c
內容概要:賦值運算子

#include <stdio.h> 
#include <stdlib.h>

//01.無符號儲存特點:
//  1.所有二進位制位全部當做資料進行解析,不考慮符號位的影響
//  2.解析的時候必須採用無符號資料所對應的格式控制符解析
//      防止將無符號的資料位解析為有符號,會造成負數(負的很大數出現)
//02.賦值運算子特點:
//  1.標準賦值運算子
//  2.複合賦值運算子
//03.位運算操作特點:
//  1.由於是直接操作記憶體當中的二進位制位,所以運算效率極其高
//  2.位運算用圖形化進行解釋比較恰當
int main01(void)
{
    unsigned char ch1 = 1;//0000 0001
    unsigned char ch2 = 3;//0000 0011
    ch1 &= ch2;//ch1=ch1&ch2;//將暫存器的運算結果賦值給記憶體當中的變數
    ch1 |= ch2;
    ch1 ^= ch2;//ch1=ch1^ch2;
    ch1 <<= ch2;
    ch1 >>= ch2;//複合賦值運算子
    printf("%d \n", ch1);

    system("pause");
    return 1;
}

//04.所有對變數的操作,只要沒有對原始變數進行賦值運算子(包括複合賦值運算子)的操作
//  就不會修改原始變數在記憶體當中的資料,使用變數的實質是使用變數當中所儲存的資料
int main02(void)
{
    unsigned char ch1 = 1;//0000 0001
    unsigned char ch2 = 3;//0000 0011
    unsigned char ch3 = ch1 & ch2;//位運算沒有改變原有變數的值,只是提取原來的資料在記憶體中用於計算

    system("pause");
    return 1;
}

程式片段(10):位與.c+位或.c+位異或.c+位反.c+左移.c+右移.c
內容概要:位運算

///位與.c
#include <stdio.h>
#include <stdlib.h>

//01.位與運算子的使用特點:
//  1.&-->位與
//      00 0
//      01 0
//      10 0
//      11 1
//  2.位與運算子特點:
//      只有兩個進行位與運算的二進位制位同為1的時候,結果為1
//  3.位與運算子的實際應用:
//      任何二進位制位位與上一個0,其二進位制位與運算的結果都會變成0
//              XXXX
//          &   0000
//              0000
//      任何二進位制位位與上一個1,期二進位制位與運算的結果都會保留原二進位制位
//              XXXX
//          & 1111
//              XXXX
int main03(void)
{
    unsigned char ch = 255;//1111 1111 
    unsigned char nch = 15;//0000 1111
    unsigned char rch = ch & nch;
    printf("%d \n", rch);//這裡含有判斷變數符號的解析特性

    system("pause");
    return 1;
}
///位或.c
#include <stdio.h>
#include <stdlib.h>

//01.位或運算子的使用特點:
//  1.|-->位或
//      00 0
//      01 1
//      10 1
//      11 1
// 2.位或運算的特點:
//      任何兩個二進位制位進行位或運算,只要其中有一方為1,那麼結果就為1
//  3.實際應用:
//      任何二進位制位位或上一個0,其二進位制位都會保留下來
//              XXXX
//          |   0000
//              XXXX
//      任何二進位制位位或上一個1,其二進位制位都會變成1
//              XXXX
//          |   1111
//              1111
int main04(void)
{                 

    system("pause");
    return 1;
}

//02.無符號型別的資料解析特殊性:
//  1.在採用一個字元儲存單位儲存的無符號資料會被當做無符號內容進行解析
//  2.前提條件是待解析的變數是無符號型別,解析結果為255
//  原因:將單位元組記憶體資料往高位元組記憶體儲存,最高位會補上符號位(有符號的情況之下)
//      無符號的情況之下,這裡沒有進行符號位的補充
int main05(void)
{
    unsigned char ch = 255;//1111 1111
    unsigned char nch = 15;//0000 1111
    unsigned char rch = ch | nch;
    printf("%d \n", rch);//這裡很特殊,將無符號的1111 1111按照%d進行解析,結果卻是無符號的解析結果255
    //這裡預設隱含有判斷有無符號變數的特性,而且具有資料型別提升的特點

    system("pause");
    return 1;
}
///位異或.c
#include <stdio.h>
#include <stdlib.h>

//01.異或運算子的使用特點:
//  1.^-->異或
//      00 0
//      01 1
//      10 1
//      11   0
//  2.異或的特點:
//      只要兩個二進位制位不一樣,那麼進行位異或運算的結果就為1
//      只要兩個二進位制位一樣,那麼進行位異或運算的結果就是為0
//  3.異或的實際應用:
//      最有效的交換兩個變數的資料原理
int main06(void)
{
    int a = 10;//0000 1010
    int b = 20;//0001 0100

    printf("a = %d, b = %d \n", a, b);
    /*
        a 0000 1010-->原始a
        b 0001 0100-->原始b
    ^  a 0001 1110
        b 0001 0100
    ^  b 0000 1010-->最終b
         a 0001 1110
    ^  a 0001 0100-->最終a
    */
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a = %d, b = %d \n", a, b);


    system("pause");
    return 1;
}

int main07(void)
{
    unsigned char ch = 255;//1111 1111
    unsigned char nch = 0;
    unsigned char rch = ch ^ nch;
    printf("%d \n", rch);//1111 1111-->255
    //printf();只會進行嘗試型別轉換!
    //  1.判斷變數的有無符號性
    //  2.判斷有無符號,在進行型別嘗試提升:
    //      有符號,補上符號位
    //      無符號,不補符號位

    system("pause");
    return 1;
}

int main08(void)
{
    unsigned char ch = 255;//1111 1111
    unsigned char nch = 15;//0000 1111
    unsigned char rch = ch ^ nch;
    printf("%d \n", rch);//嘗試資料型別的轉換

    system("pause");
    return 1;
}
///位反.c
#include <stdio.h>
#include <stdlib.h>

//01.列印函式對於控制符的特殊解釋:
//  1.如果格式控制符的解析方式指定的解析資料位元組數
//      大於待解析的資料所佔用的位元組數,就會出現嘗試型別轉換的特點
//  2.先判斷原始變數的符號特性:
//      如果有符號,按照符號特性進行提升-->按最高位進行
//      如果是無符號,不按照符號特性提升-->補0
//  3.最後進行資料的格式控制符進行解析
int main09(void)
{
    printf("%d \n", sizeof(1));
    //0000 0000 0000 0000 0000 0000 0000 0001 +1原碼
    //1111 1111 1111 1111 1111 1111 1111 1110 - 1原碼
    unsigned char a = ~1;//取反,產生了截斷-->截斷成為了單個位元組,所有二進位制位都是1
    unsigned int b = ~1;//取反,一共三個位元組,所有位二進位制位都是1
    /*
    0000 0001
    1111 1110
    */
    printf("%d \n", a);
    printf("%u \n", b);

    system("pause");
    return 1;
}
///左移.c
#include <stdio.h>
#include <stdlib.h>

//01.左移位運算子的使用特點:
//  1.<<-->左移位
//      0001-->1000
//  2.左移位的特點:
//      移出的最高位進行捨棄,最低位補0
//  3.左移位的實際應用:
//      (1).用於提升資料的運算效率
//      (2).將十進位制資料的乘2運算
//           轉換為左移位運算,將會提升運算效率
int main10(void)
{                 
    unsigned int a = 1;
    //0000 0001   1
    //0000 0010   2

    //0000 0001 1
    //1000 0000  128
    //1111 1111 255
    //1111 1111 1 256越界
    printf("%d \n", a << 1);//左移一個二進位制位相當於原始資料乘以2的一次方
    printf("%d \n", a << 2);
    printf("%d \n", a << 3);
    printf("%d \n", a << 4);
    printf("%d \n", a << 5);
    printf("%d \n", a << 6);
    printf("%d \n", a << 32);//

    system("pause");
    return 1;
}
///右移.c
#include <stdio.h>
#include <stdlib.h>

//01.右移位運算子的使用特點:
//  1.>>-->右移位
//      1000-->0001
//  2.右移位的特點:
//      將十進位制數的二進位制位向右移動移位,相當於該十進位制數除以2
//  3.右移位運算的實際應用:
//      提升十進位制數做2的除法運算的替換法則,有利於運算效率的提升
int main11(void)
{
    int a = 100000;//0000 0001
    //0000 0000 1
    //右邊移動等價於除以2,整除
    printf("%d \n", a >> 1);
    printf("%d \n", a >> 2);
    printf("%d \n", a >> 3);
    printf("%d \n", a >> 4);
    printf("%d \n", a >> 5);
    printf("%d \n", a >> 6);
    printf("%d \n", a >> 7);

    system("pause");
    return 1;
}

程式片段(11):記憶體.c
內容概要:記憶體實體

#include <stdio.h>
#include <stdlib.h>

//01.暫存器當中所執行的操作:
//  1.表示式是在暫存器當中
//  2.常量是在暫存器當中
int main01(void)
{
    //1 + 2 = 3;
    const int a = 10;
    a + 1 = 20;//暫存器
    a = 10;

    system("pause");
    return 1;
}

程式片段(12):res.c
內容概要:printf();&scanf();返回值詳解

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.printf();函式的返回值:
//  1.正確列印出的字元個數
//  2.統計字元個數的時候,不是按照格式控制符進行統計的
//      是實際列印出的結果:例如%d--->12-->就是兩個字元
int main01(void)
{
    int num = printf("12345");
    printf("\n %d \n", num);//純字串的情況之下,返回值是字元的個數

    system("pause");
    return 1;
}

int main02(void)
{
    int num = printf("a = %d, b = %d \n", 10, 12);
    printf("\n %d \n", num);

    system("pause");
    return 1;
}

//02.scanf();函式的返回值:
//  1.表示多少個格式控制符對應的資料提取成功
//  2.一個格式控制符提取成功+1
int main03(void)
{
    int a;
    int b;
    int c;

    int num = scanf("%d%d", &a, &b);
    printf("num = %d \n", num);//scanf的返回值表示成功抓取到的資料個數

    system("pause");
    return 1;
}

程式片段(13):scanf.c
內容概要:scanf();&正規表示式

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.scanf();函式使用特點:
//  1.預設掃描結束識別符號:
//      空格,Tab鍵,回車被當做為預設的資料掃描結束指令
//  2.採用正規表示式進行任意指定結束識別符號
//      正規表示式:"%[^結尾識別符號]"
int main01(void)
{
    char str[100] = { 0 };
    //scanf("%s", str);//空格,Tab鍵,回車當做結束
    //scanf("%[^\n]", str);//處理空格,Tab鍵,回車
    //scanf("%[^,],str");
    scanf("%[^,]", str);//,#=作為結束符
    printf("str = %s \n", str);

    system("pause");
    return 1;
}

//02.scanf();函式與正規表示式的結合使用特點:
//  1.正規表示式的特點解析:
//      遇到第一個不是XXXX的就結束資料掃描操作
//          %[XXXX]
//      遇到第一個是XXXX的就結束資料掃描操作
//          %[^XXXX]
//  2.指定掃描的資料型別
//      只能是數字%[0-9]
//      只能是字母%[a-zA-Z]
int main02(void)
{
    char str[100] = { 0 };
    //scanf("%[1]", str);//遇到第一個不是1的字元就結束資料掃描操作
    //scanf("%[A-Z]", str);//遇到第一個不是A-Z之間的字元就結束資料掃描操作
    //scanf("%[^A-Z]", str);//遇到第一個是A-Z之間的字元就結束資料草廟操作
    //scanf("%[a-zA-Z]", str);
    scanf("%[0-9a-zA-Z]", str);
    printf("str = %s \n", str);//電話只有數字

    system("pause");
    return 1;
}

程式片段(14):run.c
內容概要:記憶體實體以及運算子優先順序

#include <stdio.h>
#include <stdlib.h>

//01.常量內容解析:
//  1.常量的分類:
//      巨集常量:真正意義上的常量
//          不具備記憶體實體;
//          既不能直接賦值,也不能間接賦值
//      常變數:一般意義上的常量
//          具備記憶體實體
//          不能直接賦值,但是可以間接賦值
//      劃分標準:
//          巨集常量不具備記憶體實體
//          常變數具備記憶體實體
//  2.對記憶體實體的賦值注意事項:
//      要看指標的型別特點:
//          const修飾的指標不能修改記憶體實體
//          非const修飾的指標可以修改記憶體實體
//  3.是否具備記憶體實體是區分左值和右值的關鍵
//      左值一定可以出現在賦值號的左邊,一定可以出現賦值號的右邊
//      右值一定可以出現在賦值號的右邊,但是不一定可以出現在賦值號的左邊
int main01(void)
{
    int a;
    a = 10;

    //能取記憶體的地址,有記憶體實體
    const int b = 10;
    //b = 10;//左值指定const物件
    *(int *)&b = 12;//define const只能保證不能直接賦值,但是不能保證不能進行間接賦值,通過變數地址可以進行賦值
    printf("%d \n", b);

    //a + 1 = 1;
    //3 + a = 2;
    //printf("%p \n", &a);

    int * p = &a;
    int *p1 = &b;

    system("pause");
    return 1;
}

相關文章