一把梭系列 ~ C語言範例 (0013) [字串 輸入/輸出、長度計算、複製、串接]

一把梭系列 ~ C語言範例 (0013) [字串 輸入/輸出、長度計算、複製、串接]

一把梭系列 ~ C語言範例 (0013) [字串 輸入/輸出、長度計算、複製、串接]


資料來源: https://openhome.cc/Gossip/CGossip/StringLengthCopyCat.html

https://www.cplusplus.com/reference/cwchar/wcslen/
https://www.cplusplus.com/reference/cwchar/wcscpy/
https://www.cplusplus.com/reference/cwchar/wcsncpy/
https://www.cplusplus.com/reference/cwchar/wcscat/
https://www.cplusplus.com/reference/cwchar/wcsncat/
https://www.cplusplus.com/reference/cwchar/wprintf/
https://www.cplusplus.com/reference/cwchar/wscanf/
https://www.cplusplus.com/reference/cstdio/puts/
https://docs.microsoft.com/zh-tw/cpp/c-runtime-library/reference/puts-putws?view=msvc-160
https://www.ibm.com/docs/en/i/7.1?topic=functions-fputws-write-wide-character-string


★前言:


★主題:

    在〈字元陣列與字串〉說過,在 C 語言中,字串是一個字元陣列,最後一個字元以空字元 ‘\0’ 作結尾。


    但由於它就具有各元素依序組合後的實際單詞義意,並且也依照不同編碼格式而有所不同,因此C語言有提供一系列的對應函數方便使用者使用。
    

     下面我們就將C語言提供的相關功能進行分門別類的初步整理與介紹:


    01.字串輸入函數:

    int fputs(const char *str,FILE *stream);

    int fputws(const wchar_t *wcs, FILE *stream);


    02.字串輸出函數:

    int puts(const char *str);

    int _putws(const wchar_t *str);


    03.字串長度計算函數:

    size_t strlen(const char *str );

    size_t wcslen (const wchar_t* wcs);


    04.字串拷貝函數:

    char *strcpy( char *restrict dest, const char *restrict src );
    char *strncpy( char *restrict dest, const char *restrict src, size_t count );

    wchar_t* wcscpy (wchar_t* destination, const wchar_t* source);
    wchar_t* wcsncpy (wchar_t* destination, const wchar_t* source, size_t num);


    05.字串串接函數:

    char *strcat( char *restrict dest, const char *restrict src );
    char *strncat( char *restrict dest, const char *restrict src, size_t count );

    wchar_t* wcscat (wchar_t* destination, const wchar_t* source);
    wchar_t* wcsncat (wchar_t* destination, const wchar_t* source, size_t num);

    
★code:

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <string.h>

#define LEN 80

int main()
{
    /*
    //預設編碼環境設定:
    //Setting -> Editor ->Global compiler settings->Other options -> default
    //Build options->compiler settings->Other options []

    char buf[LEN];

    puts("請輸入名稱...");
    // fgets 會包括 enter 字元
    fgets(buf, LEN, stdin);

    int lenOfName1 = strlen(buf) + 1;
    char name1[lenOfName1];
    strcpy(name1, buf);
    printf("名稱:%s", name1);

    // 不複製換行字元
    int lenOfName2 = lenOfName1 - 1;
    char name2[lenOfName2];

    // 設定全部字元為空字元
    memset(name2, '\0', lenOfName2);
    strncpy(name2, buf, lenOfName2);
    printf("名稱:%s", name2);

    char str1[] = "xyz";
    char str2[] = "abc";

    int len = strlen(str1) + strlen(str2) + 1;
    char concated[len];
    memset(concated, '\0', len);

    strcat(concated, str1);
    strcat(concated, str2);

    printf("串接後:%s\n", concated);
    //*/

    //*
    //使用寬字串/UTF-8 環境設定:
    //Setting -> Editor ->Global compiler settings->Other options -> UTF-8
    //Build options->compiler settings->Other options [-finput-charset=UTF-8]

    setlocale(LC_ALL, "");
    wchar_t buf[LEN];

    wprintf(L"請輸入名稱...\n");
    wscanf (L"%ls",buf);

    int lenOfName1 = wcslen(buf);
    wchar_t name1[lenOfName1];
    wcscpy(name1, buf);
    wprintf(L"名稱:%ls\n", name1);

    // 不複製換行字元
    int lenOfName2 = lenOfName1;
    wchar_t name2[lenOfName2];

    // 設定全部字元為空字元
    memset(name2, '\0', lenOfName2);
    wcsncpy(name2, buf, lenOfName2+1);
    wprintf(L"名稱:%ls\n", name2);

    wchar_t *str1 = L"xyz";//error: invalid initializer ~  str1[]= "xyz";
    wchar_t *str2 = L"abc";

    int len = wcslen(str1) + wcslen(str2);
    wchar_t concated[len];
    memset(concated, '\0', len);

    wcscat(concated, str1);
    wcscat(concated, str2);

    wprintf(L"串接後:%ls\n", concated);
    //*/

    return 0;
}


★結果:


★延伸說明/重點回顧:

    01.C語言的字串就是字元陣列
    
    02.從函數介紹可以大致發現寬字串和標準字串函數用法觀念幾乎一致,其差別就只有函數名稱和參數型態
    
    03.如果當字串內會有非英數字的內容,建議將編譯器設定為UTF-8編譯模式,並且使用wchar_t資料型態

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *