目次
ご質問やご意見がございましたら、コメント欄にメッセージを残してください。
1.文字列関数
1.1ショット
1.2strcpy
1.3strcat
1.4strcmp
1.5strncpy
1.6strncat
1.7 strncmp
1.8strstr
1.9ストラトク
1.10ストエラー
長さ無制限の文字列関数
1.1ショット
strlen 関数は、文字列の長さを調べるために使用されます。
size_t strlen (const char * str); (文字列) const は、ポインタが指す内容を変更できないことを意味します
予防:
文字列は終了マークとして '\0' を使用し、strlen 関数は '\0' より前の文字数 ('\0' を除く) を返します。
パラメータが指す文字列は '\0' で終わる必要があります。
関数の戻り値 size_t は、基本的に unsigned int です。 (typedef unsigned int size_t という名前を変更します)
strlen関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = { 'a','b','c' };
printf("%d\n", strlen(arr1));//错误使用,strlen以'\0'作为结束标志,而在arr1中不知道'\0'在什么位置,结果是一个随机值
printf("%d\n", sizeof(arr1));
char arr2[] = { "abcdef" };
printf("%d\n", strlen(arr2));//strlen不统计'\0'
printf("%d\n", sizeof(arr2));//sizeof会统计'\0'
return 0;
}
strlen関数のシミュレーション実装
実装する 3 つのメソッド: カウント、ポインター演算、再帰
#include<stdio.h>
#include<stdlib.h>
//数数
size_t de_strlen1(const char* arr)
{
int count = 0;
while (*arr != '\0')
{
count++;//过一位,数一个
arr++;
}
return count;
}
//指针-指针(得到的值是它们之间的元素个数)
size_t de_strlen2(const char* arr)
{
const char* arr1 = arr;
while (*arr != '\0')
{
arr++;//放在while中会多移一位
}
return arr- arr1;
}
//递归
size_t de_strlen3(const char* arr)
{
if (*arr != '\0')
{
return 1 + de_strlen3(arr + 1);
}
else
return 0;
}
int main()
{
char arr[] = { "abcdef" };
int re1=de_strlen1(arr);
printf("%d\n", re1);
int re2 = de_strlen2(arr);
printf("%d\n", re2);
int re3 = de_strlen3(arr);
printf("%d\n", re3);
return 0;
}
1.2strcpy
strcpyは文字列コピー関数です。
char * strcpy ( char * 宛先, const char * ソース ); (宛先スペース, ソース文字列)
予防:
ソース文字列は '\0' で終わる必要があります。
同時に、ソース文字列内の '\0' もターゲット スペースにコピーされます。
宛先スペースは、ソース文字列を保持するのに十分な大きさである必要があります。
ターゲット空間は可変である必要があります。 (定数ではありません)
strcpy関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10] = { "home" };
char arr2[5] = { "ouse" };
strcpy(arr1+1, arr2);
printf("%s", arr1);
return 0;
}
strcpy関数のシミュレーション実装
#include<stdio.h>
#include<string.h>
char* de_strcpy(char* dest, const char* src)
{
char* re = dest;//记录初始地址
while (*dest++ = *src++)//++后置先运算后++,直到遇到'\0',循环结束。
{
;
}
return re;
}
int main()
{
char arr1[10] = { "home" };
char arr2[5] = { "ouse" };
de_strcpy(arr1+1, arr2);
printf("%s", arr1);
return 0;
}
1.3strcat
strcat は文字列追加関数です
char * strcat (char * 宛先, const char * ソース); (宛先スペース, ソース文字列)
予防
ソース文字列は '\0' で終わる必要があります。
宛先スペースは、ソース文字列を保持するのに十分な大きさである必要があります。
目標は可変的でなければなりません。
strcat 自体を追加することはできません。 (自分の '\0' を上書きします)
strcat関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = { "hello " };
char arr2[10] = { "world" };
strcat(arr1, arr2);
printf("%s", arr1);
strcat(arr2,arr2)//错误
return 0;
}
strcat関数のシミュレーション実装
#include<stdio.h>
#include<string.h>
char* de_strcat(char* dest, const char* src)
{
char* re = dest;
1、找到目标空间的'\0'
while (*dest)//切记不能把++放在这,因为循环结束后,++指针会调到'\0'后面一位
{
dest++;
}
2、追加
while (*dest++ = *src++)
{
;
}
return re;
}
int main()
{
char arr1[20] = { "hello " };
char arr2[10] = { "world" };
de_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
1.4strcmp
strcmp 関数は 2 つの文字列のサイズを比較します。
int strcmp ( const char * str1, const char * str2 ) (文字列 1, 文字列 2)
strcmpの戻り値
>0 文字列 1 >文字列 2
=0 文字列 1 > 文字列 2
<0 文字列 1 < 文字列 2
strcmp関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = { "abcd" };
char arr2[] = { "abcdef" };
char arr3[] = { "qq" };
int re1 = strcmp(arr3, arr2);
int re2 = strcmp(arr3, arr3);
int re3 = strcmp(arr1, arr2);
printf("%d\n", re1);
printf("%d\n", re2);
printf("%d\n", re3);
return 0;
}
strcmp関数のシミュレーション実装
#include<stdio.h>
#include<string.h>
int de_strcmp(const char* str1, const char* str2)
{
//判断两个字符串是否相等
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
//比较字符的ascll码值
return *str1 - *str2;
}
int main()
{
char arr1[] = { "abcd" };
char arr2[] = { "abcdef" };
int re = de_strcmp(arr1, arr2);
printf("%d", re);
return 0;
}
皆さんもこれを見たことがあるでしょう、xdm は無料の 3 ウェイ ウェーブを検討しているのではありませんか?
上の続きから休憩してください
長さ制限のある文字列関数
1.5strncpy
char * strncpy ( char * 宛先, const char * ソース, size_t num ); (宛先スペース、ソース文字列、コピー数)
予防
num 文字列をターゲットスペースにコピーします。
ソース文字列の長さが num 未満の場合は、ソース文字列をコピーした後、ターゲットの末尾に num になるまで 0 を追加します。
strncpy関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10] = {"hello"};
char arr2[10] = { "ry" };
strncpy(arr1, arr2, 2);
printf("%s\n", arr1);
char arr3[10] = { "hello" };
char arr4[10] = { "ry" };
strncpy(arr3, arr4, 3);
printf("%s\n", arr3);
return 0;
}
1.6strncat
char * strncat (char * デスティネーション, const char * ソース, size_t num); (デスティネーション スペース, ソース文字列, 追加番号)
予防:
ターゲット スペースに num 文字列と 1 つの '\0' を追加します。
C 文字列の長さが num 未満の場合は、'\0' の前のみをコピーします; コンテンツ。
strncat関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10] = { "ha" };
char arr2[5] = { "hahe" };
strncat(arr1, arr2, 2);
printf("%s", arr1);
return 0;
}
1.7 strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
予防:
異なる文字が表示されるか、1 つの文字が終了するか、すべての num 文字が比較されるまで比較します。
戻り値は strcmp と同じ意味です。
strcamp関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = { "abcd" };
char arr2[] = { "ab" };
int re1=strncmp(arr1, arr2, 2);
int re2 = strncmp(arr1, arr2, 3);
printf("%d\n", re1);
printf("%d\n", re2);
return 0;
}
文字列検索
1.8strstr
stratr 関数は部分文字列を検索するために使用されます。
const char * strstr ( const char * str1, const char * str2 ); (文字列, 部分文字列)
予防:
str2 が存在しない場合、str1 で最初に出現する str2 へのポインタを返します。 a> マッチング プロセスには '\0' は含まれませんが、これで終了します。 は null ポインタを返します。 str1
strstr関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]= {"abcdefg"};
char arr2[]= {"bcd"};
char arr3[]= {"cbd"};
char* re1 = strstr(arr1, arr2);
char*re2=strstr(arr1, arr3);
if (re1 == NULL)
{
printf("找不到子字符串\n");
}
else
{
printf("%s\n", re1);
}
if (re2 == NULL)
{
printf("找不到子字符串\n");
}
else
{
printf("%s\n", re2);
}
return 0;
}
strstr関数のシミュレーション実装
#include<stdio.h>
#include<string.h>
char* de_strstr(const char* str1, const char* str2)
{
const char*re = str1;
const char* s2 = str2;
const char* s1= str1;
if (str2 == NULL)
{
return (char*)str1;
}
while (*re)
{
s2 = str2;
s1=re;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)re;
}
re++;
}
return NULL;
}
int main()
{
char arr1[10]= {"abbcdefg"};
char arr2[4]= {"bcd"};
char arr3[4]= {"cbd"};
char* re = de_strstr(arr1, arr2);
if (re== NULL)
{
printf("找不到子字符串\n");
}
else
{
printf("%s\n", re);
}
return 0;
}
1.9ストラトク
char * strtok (char * str, const char * delimiters); (分割文字列、区切り文字を含む文字列)
予防:
パラメータは、区切り文字として使用される文字のセットを定義する文字列です。
最初のパラメーターは、sep 文字列内で 1 つ以上の区切り文字で区切られた 0 個以上のトークンを含む文字列を指定します。
strtok関数の使用
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "192#168.120.85";
char* p = "#.";
char buf[20] = { 0 };
strcpy(buf, arr);
char* ret = NULL;
for (ret = strtok(buf, p); ret != NULL; ret = strtok(NULL, p))
{
printf("%s\n", ret);
}
return 0;
}
エラーメッセージレポート
1.10ストエラー
strerror関数はエラー情報を取得するために使用されます。
char * strerror ( int errnum )
予防:
返されるエラー コードと対応するエラー メッセージ
ストエラー関数の使用
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
printf("%s\n", strerror(5));
printf("%s\n", strerror(6));
printf("%s\n", strerror(7));
printf("%s\n", strerror(8));
printf("%s\n", strerror(9));
printf("\n");
FILE* P = fopen("test.txt", "r");
if (P == NULL)
{
printf("%s\n", strerror(errno));
perror("fopen");//作用跟strerror相同
return 1;
}
return 0;
}
文字分類機能
関数
|
パラメータが次の条件を満たしている場合に true を返します。 |
iscntrl | 任意の制御文字 |
イススペース |
空白字符:空格‘ ’
,换页
‘\f’
,换行
'\n'
,回车
‘\r’
,制表符
'\t'
或者垂直制表符
'\v'
|
自分自身の数字 | 16 進数(すべての 10 進数字を含む)、小文字a~f、大文字A~ファ |
平 |
10進数0~9
|
低い |
小文字 a ~ z
|
上です | 大写字母A~Z |
イアルファ |
字母a~z
或
A~Z
|
氷のホール |
文字または数字、a~z、A~Z、0~9
|
途切れている |
句読点、数字や文字以外のグラフィック文字 (印刷可能)
|
イスグラフ |
任意のグラフィック文字
|
文字変換:
文字切り出し機能と文字変換の利用
#include<stdio.h>
#include<ctype.h>
void* de_tolower(char* arr)
{
char* re = arr;
while (*arr)
{
if (isupper(*arr))//判断是否为大写字母,是返回真,不是++检查下一个
{
*arr = tolower(*arr);//转换成小写字母
}
arr++;
}
return re;
}
int main()
{
char arr[] = { "Hello WORLD" };
char*re = (char*)de_tolower(arr);
printf("%s\n", re);
return 0;
}