Linux Cプログラミング学習6---文字列処理、データ変換

5272 ワード

1.文字列アプリケーションは、その機能によって数値計算、非数値計算、入出力操作などに分けられます.非数値計算プログラムはかなりの割合を占め、その核心は文字列処理1.1である.文字テスト1.1.1.文字が英字int isalpha(int c)であるかどうかをテストします.cが英字である場合はゼロ以外の値を返し、そうでない場合は0 1.1を返す.2.文字がint isdigit(int c)であるかどうかをテストします.cが数字の場合、ゼロ以外の値を返します.そうでない場合、戻り値は01.2です.文字列初期化C言語では、文字列は文字配列として処理され、メモリ内の連続する領域に対応するvoid*memset(void*buffer,int c,int count)を使用してこの連続するメモリを初期化するbufferはポインタであり、私たちが初期化する連続メモリのヘッダアドレスパラメータcを指す.このメモリをどの文字に初期化するかを説明するためのもので、cが0であれば、このメモリをパラメータcountをクリアし、設定したメモリのバイト数の例です
#include<stdio.h>

#include<string.h>

int main()

{

char s[]="hello world";

printf("%s
", s); memset(s, 'H', 5); printf("%s
", s); return 0; }

出力結果は次のとおりです.
    hello world    HHHHH world1.3.文字列のコピー1.3.1.char*strcpy(char*dest,char*src)は、srcが指す文字列をdestが指すメモリにコピーします.なお、この2つのパラメータが指すメモリ領域は、重複が許されない関数の戻り値であるdestへのポインタ1.3である.2.char*strdup(char*s)関数の戻り値は、コピー文字列を指すポインタであり、メモリ領域はシステムが自動的に割り当てる1.3である.3. void *memcpy(void *dest, void *src, unsigned int count)パラメータsrcが指すメモリ領域をcountバイトをdestが指すメモリ領域にコピーします.この2つのポインタが指すメモリ領域も重なり合ってはいけない関数の戻り値は、destを指すポインタとstrcpyの違いです.memcpyがソースメモリとターゲットメモリのポインタに与えられた後、指定サイズ(unsigned int count)のメモリをコピーし、メモリの具体的な内容をチェックせずに文字列の終端を含め、前のstrcpy関数は文字列の終端に遭遇するとすぐにコピーを停止するのでmemcpyは1.3.4.void*memmove(void*dest,const void*src,size_t n)を文字列として見ていない.パラメータsrcが指すメモリ領域をdestが指すメモリ領域にnバイトコピーするとstrcpy、memcpyとは異なり、この2つのポインタが指すメモリ領域が重なる例である
#include<stdio.h>

#include<string.h>

int main()

{

char s[] = "Linux C Programming";

printf("%s
", s); memmove(s, s+6, strlen(s)-6); s[strlen(s)-6] = '\0'; printf("%s
", s); return 0; }

出力結果は
      Linux C Programming       C Programming1.4.文字列の比較1.4.1.int strcmp(const char*s 1,const char*s 2)パラメータs 1とs 2が指す文字列を比較し、比較の根拠は文字のASCIIコードの値であり、まずs 1の最初の文字からs 2の最初の文字を減算し、同じであれば2番目の文字を比較し続け、その後比較する.文字列が同一である場合、戻り値は0である、同一でない場合、同一でない文字のASCII符号の差分値1.4を返す.2.int strncmp(const char*s 1,const char*s 2,size_t n)s 1とs 2が指す文字列の最初のnバイト1.4を比較する.3.int strcasecmp(const char*s 1,const char*s 2)はstrcmpに似ているが、比較の過程で大文字と小文字を無視する1.4である.4. int strncasecmp(const char *s1, const char *s2, size_t n); strncmpと似ているが、比較の過程で大文字と小文字の1.4を無視する.5.int memcmp(const void*s 1,const void*s 2,size_t n)は、s 1とs 2が指すメモリ空間の最初のnバイトを比較するが、比較の際、s 1とs 2を文字列とするものではなく、メモリ領域における文字列終端子1.5は考慮する.文字/文字列検索1.5.1.char*index(const char*s,int c)パラメータs 1が指す文字列で、往路後から文字cを検索し、cが初めて現れる位置を見つけたら、この位置を指すポインタを返し、この文字が見つからない場合null例を返す
#include<stdio.h>

#include<string.h>

int main()

{

char s[] = "hello world";

char *p;

p = index(s, 'w');

printf("%s
", p); return 0; }

出力結果は
      world   1.5.2.char*rindex(const char*s,int c)はindexと似ているが、後から1.5を探す.3.char*strchr(const char*s,int c)はindexと似ていますが、'0'という文字は検索できません.index(s,'0')の形式で使用できるがstrchr(s,'0')1.5では使用できない.4.char strrctr(const char*s,int c)はrindexと似ていますが、'0'という文字は検索できません.rindex(s,'0')の形式では使用できるがstrrchr(s,'0')1.5は使用できない.5.char*strstrstr(const char*haystack,const char*needle)文字列haystackで文字列needleを検索し、最初に現れた位置を返し、見つからない場合は空のポインタ1.6を返す.文字列接続分割1.6.1.char*strcat(char*dest,const char*src)は、srcが指す文字列をdestが指す文字列に接続し、ターゲットポインタの開始アドレスを返します.ターゲット文字列には十分なバッファが必要です.そうしないとオーバーフロー例が発生します.
#include<stdio.h>

#include<string.h>

#define BUFFER_SIZE 64

int main()

{

char s[BUFFER_SIZE] = "orld;

char d[BUFFER_SIZE] = "hello w";

strcat(d, s);

printf("%s
", s); printf("%s
", d); return 0; }

出力結果は
      orld       hello world   1.6.2.char*strncat(char*dest,const char*src,size_t n)は、srcからnバイトを取り出し、destが指す文字列に接続する.srcの最初のnバイトに'0'が表示されない場合、最後に'0'1.6が自動的に追加されます.3.char*strtok(char*str,const char*delim)str文字列をdelimという分割記号で分割します.文字列strに区切り記号が見つかった場合、文字列の終端記号の例に変更します.
#include<strio.h>

#include<string.h>

int main()

{

char str[] = "Linux C Programming";

char *p;

p = strtok(str, " ");

while(p != NULL)

{

printf("%s
", p); p = strtok(NULL, " "); } printf("str : "%s
", str); return 0; }

出力結果は
      C       Programming       str : Linux
 
2.データ変換データ変換は、英字の大文字と小文字の変換、文字列と整数、浮動小数点数の変換2.1を含む.アルファベットの大文字と小文字の変換int toupper(int c)は小文字の英字を大文字に変換し、cが小文字であれば対応する大文字を返し、そうでなければ元の値int tolower(int c)を返して大文字の英字を小文字に変換し、原理は上の2.2に似ている.文字列変換は、文字列と整数、浮動小数点数との間の変換2.2を実現する.1.文字列を整数int atoi(const char*nptr)long atol(const char*nptr)に変換する2つの関数は、数値または正負が現れるまで文字列をスキャンします.次に非数値または文字列終端が現れると変換を停止し、結果を10進数しか変換できない文字列の例に戻す
#include<stdio.h>

#include<string.h>

int main()

{

char a[] = "-100";

char b[] = "0x20";

int c;

c = atoi(a) + atoi(b);

printf("c = %d
", c); return 0; }

出力結果は
-100は、aを-100に変換する、bを0 x 20に変換するため、変換時には、まず0を0に変換し、xに遭遇すると変換2.2を停止する.2.文字列を浮動小数点数double atof(const char*nptr)関数に変換するには、まず文字列をスキャンし、数値または正負の番号が現れるまで変換を開始し、その後、非数値または文字列の終端が現れると変換を停止し、結果をこの関数に戻す.文字列には+、-、小数点、E、e(E、eは浮動小数点数の指数部分を表す)2.2.3.浮動小数点数を文字列char*gcvt(double number,size_t ndigits,char*buf)に変換する最初のパラメータは変換する浮動小数点数の2番目のパラメータは表示する桁数の3番目のパラメータは最終結果を格納するためのバッファである