文字と文字列関数(2)

キー:

文字列の長さを求める1.
strlenを
2.無制限の長さの文字列関数は、
strcpyの:コピー
STRCAT:追加文字列
のstrcmp:比較
3.限られた長さの文字列関数が記述さ
はstrncpy:コピー
strncat:追加
strncmpは:比較
4.文字を位置決めストリング
はstrstrを:サブ文字列の文字列検索
切断列:はstrtok
のエラー情報5
にstrerror
6にキャラクタの動作
7.メモリ操作機能が
MEMCPY:メモリコピーが重複しないことがあり
MEMMOVE:メモリコピーが重複してもよい
のmemsetました:指定された文字
memcmp:比較

:1.2要約記事で、過去に導入された
[文字と文字列関数(1)(https://mp.csdn.net/mdeditor/102987934#)

strncpyを

長さが制限され
ST * 1.char R&LT N- CPY(どこがcharをしたいです*、constのchar型*ソース、size_tのNUM);
2.注:
ソース文字列(ソース)からのコピーをnum文字(あなたが欲しいん)対象空間へ。
ソース文字列の長さがNUM未満の場合、ソース文字列のコピーを完了した後、0は最初のNUMまで、ターゲットの後ろに追加されます。
strncpyをあなたは「\ 0」、必要が自分自身を書くことを保証する助けにはならない
NULLに加えて、他の製剤は、(NULL、NULLなど)が表明している「\ 0」

int main()
{
	char arr[20] = { 0 };
	strncpy(arr, "hello bite", 3);
	printf("%s\n", arr);//hel
	return 0;
}

strcpyのとstrncpyをの違い

strncat—追加

長限定
1.char * strncat(CHAR *先、 CONSTチャー*ソース、size_tのNUM);
コンテンツソースがデスティネーション、長NUMに追加文字に追加されます。

int main ()
{
  char str1[20];
  char str2[20];
  strcpy (str1,"To be ");
  strcpy (str2,"or not to be");
  strncat (str1, str2, 6);//To be or not
  puts (str1);
  return 0;
}

strncmpは

長さ制限
1.int strncmpは(CONSTチャー* STR1、STR2 CONSTのchar *、size_tのNUM);
2.比較は、異なる文字または文字列の他端に現れるまたは全て終了を比較NUM。

int main ()
{
  char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
  int n;
  puts ("Looking for R2 astromech droids...");
  for (n=0 ; n<3 ; n++)
  if (strncmp (str[n],"R2xx",2) == 0)
  {
    printf ("found %s\n",str[n]);
    //Looking for R2 astromech droids...
    //found R2D2
    //found R2A6
  }
  return 0;
}

文字列の部分文字列を検索しますstrstr-

* STRSTR 1.char(定数文字*、constのchar型*);
2.
strchr:文字列内の子文字を見つけます

int main()
{
	char arr[] = "abcdefabcdef";
	char* ret = strchr(arr, 'd');
	if (ret != NULL)
		printf("%s\n", ret); //defabcdef
	else
		printf("找不到\n");
	return 0;
}

strstr:文字列の部分文字列が最初に現れる位置を見つけます

int main()
{
	char arr[] = "abcdefabcdef";
	char* ret=strstr(arr, "def");//defabcdef
	printf("%s\n", ret);
	return 0;
}

キー:

char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cur = str1;

	assert(str1);
	assert(str2);
	if (*str2 == '\0')
		return str1;

	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		//查找
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return (char*)cur;
		cur++;
	}
	//找不到
	return NULL;
}

あなたは、効率を改善したい場合は、このコード効率は低いです。KMPアルゴリズムは、アルゴリズムを用いて実現することができます。しかし、KMPアルゴリズムが複雑であるので、この中では特に説明しません。

文字列を切断strtok-

*はstrtok 1.char(9でSTRのchar *、CONST CHAR *);
2.注:
(1)9月パラメータには、文字のセットを定義する文字列を区切り文字として使用されている
(2)最初の引数を指定する文字列、これは、1つ以上の9月セパレータ分割マークからのゼロ以上の文字列を含んでいます。
(3)strtok関数は、タグは、ポインタへのポインタを返し、STRおよび\ 0端で次のトークンを見つけ。
strtok関数は、文字列はコンテンツが変更され、一般的に、文字列の一時的なコピーをスライスはstrtokするために使用することができるように、操作された変更されます。
最初の引数(4)strtok関数はNULLでない機能があります、 strの最初のマーカー、strtok関数は、文字列内での位置が保存されます。
(5)第1のパラメータstrtok関数はNULLであり、関数は見つけるために、記憶される文字列内の同じ位置で開始され、次のマーカー
存在する場合(6)以上のマークが、文字列が存在するNULLポインタを返します。

写法一:
int main()
{
	//char arr1[] = "192.168.0.1";
	char arr2[] = "[email protected]";//3个标记[zj baidu com]   2个分隔符[@ .]
	char buf[30] = { 0 };
	strcpy(buf, arr2);//拷贝数据,处理buf数组的内容
	printf("%s\n", strtok(buf, "@."));//zj 从第一个标记开始到分隔符结束
	printf("%s\n", strtok(NULL, "@."));//baidu 从第二个标记开始到分隔符结束
	printf("%s\n", strtok(NULL, "@.")); //com
	return 0;
}

写法二:
int main()
{
	char arr2[] = "[email protected]";//3个标记[zj baidu com]   2个分隔符[@ .]
	char buf[30] = { 0 };
	char* ret = NULL;
	strcpy(buf, arr2);
	for (ret = strtok(buf, "@."); ret != NULL; strtok(NULL, "@."))
	{
		printf("%s\n", ret);
		//zj 
		//baidu
		//com
	}
	return 0;
}

写法三:
int main()
{
	char arr2[] = "[email protected]";//3个标记[zj baidu com]   2个分隔符[@ .]
	char buf[30] = { 0 };
	char* ret = NULL;
	const char* sep = "@.";
	strcpy(buf, arr2);
	for (ret = strtok(buf, sep); ret != NULL; strtok(NULL, sep))
	{
		printf("%s\n", ret);
		//zj 
		//baidu
		//com
	}
	return 0;
}

strerror

*はstrerrorの1.char(INT errnumの);
2. ヘッダの#include <ERRNO.H> //含んでいなければならない
3。

int main()
{
	char* ret = strerror(errno);
	printf("%s\n", ret);
	return 0;
}

エラーコードの概要
4。

int main ()
{
  File *p= fopen ("unexist.ent","r");
  if (p File == NULL)
    printf ("Error opening file unexist.ent: %s\n",strerror(errno));
    //errno: Last error number
  return 0;
}
fclose();
p=NULL;

文字分類機能

1. ヘッダファイルます。#include <のctype.h>
2。

機能 以下の条件を持つ彼の議論はtrueを返している場合
iscntrlは 任意の制御文字
isspace 空白文字:スペース '' フィード '\ F'、改行 '\ N-' と入力し '\ R&LT' タブ '\ t' のか、垂直タブ '\ V'
isdigit 十進数0から9
isxdigit すべての十進数を含む16進数、大文字AF、AF小文字
islowerは 小文字AZ
isupper 大文字AZ
Islf 文字A〜ZまたはAZ
isalnum 文字や数字、aからz、AZ、0-9
ispunct 句読点は、グラフィック文字(印刷可能)のいずれかの数字または文字に属していません
isgraph 任意のグラフィック文字
プリントアウト 空白文字とグラフィック文字を含む任意の印刷可能な文字、
int main()
{
	int ret = isdigit('0');
	printf{ "ret=%d\n",ret };
	return 0;
}

文字変換機能

1. 头文件ます。#include <のctype.h>
2.
INT TOLOWER(INT c)前記
int型のtoupper(int型C);
3。

int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    if (isupper(c)) 
        c=tolower(c);
    putchar (c);
    i++;
  }
  return 0;
}

memcpy-メモリコピー

memcpy * 1.void(ボイド* CONSTボイド*先、送信元、size_tのNUM);
2。注:
機能が後方位置から、コピー元のmemcpyをNUMバイトの宛先メモリ位置へのデータ。
この関数は「\ 0」の時間に直面してと停止しません。
ソースと宛先が任意の重複がある場合、結果は未定義で複製されます。(VSコピーを重複していてもよい)
3。

void* my_memcpy(void* dest, const void* src, size_t count)
{
	void* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	//拷贝
	while (count)
	{
		//拷贝一个字节
		*(char*)dest = *(char*)src;
		((char*)dest)++;
		((char*)src)++;
		//++(char*)dest;
		//++(char*)src;
		count--;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	int arr2[10] = { 0 };
	my_memcmp(arr2, arr1, 20);// 1 2 3 4 5   20为字节数(4*5)
	return 0;
}

あなたが位置3456に1234をコピーする必要がある場合:
(ARR1のARR1 + 2、16の)my_memcmpを、コードの出力は次のようになります。この場合、1212127890、エラーの。
原因:
3にコピー時間1、および3は、3〜5のこの時点では、変更してからコピーは1、いない3であるとき、コピーされます。
2〜4をコピーするコピーは、2つ、ない4である場合、4が6にコピーされ、この場合4で、変化します。
12コピーした後、配列は次のようになります。1212567890

この場合、コピーから前方に移動させる必要がある今1〜3コピーまで、4〜6コピー、コピーした後、順次前方であろう。
しかし、あなたは3456 1234へのコピーが必要な場合は、コピーは後方問題になります。MEMMOVEので、この時点で、我々は機能を使用する必要があります。

MEMMOVE

* MEMMOVE 1.void(どこがvoid *をしたいです、CONST void *型ソース、size_tのNUM);
2.注:
のMEMMOVE機能処理ソースメモリ・ブロックターゲット・メモリ・ブロックをすることである重ねることに。ソース空間と目標空間重複する場合、MEMMOVE機能処理を使用しなければなりません。

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	//把2 3 4 5拷贝到1 2 3 4
	mommove(arr1 + 2, arr1, 16); //3 4 5 6 5 6 7 8 9 0
	return 0;
}
void* my_mommove(void* dest, const void* src, size_t count)
{
	void* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	if (dest < src)
	{
		while (count)
		{
			//拷贝一个字节
			*(char*)dest = *(char*)src;
			dest=((char*)dest)+1;
			src=((char*)src)+1;
			count--;
		}
	}
	else
	{
		//后->前
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
	}
	return ret;
}

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	my_mommove(arr1 + 2, arr1, 16); //3 4 5 6 5 6 7 8 9 0
	my_mommove(arr1, arr1 + 2, 16); //1 2 1 2 3 4 7 8 9 0
	return 0;
}

ここに画像を挿入説明

memcmp

Memcmpの1.int(PTR1 CONSTボイド*、CONSTボイド* PTR2、size_tのCOUNT);
2.注:
比較PTR1及びPTR2ポインタバイトNUM開始から
同じ戻りNUMバイト0
PTR1> PTR2:> 0戻り
PTR1 <PTR2:戻る<0

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	int arr2[10] = { 0 };
	memcmp(arr2, arr1, 20);//20为字节数(2*10)
	return 0;
}

memset-各バイトは、指定された文字のスペースに初期化されます

* memsetのは(SRC、size_tのCOUNT int型、* destの無効)1.void;
COUNT:バイトSRC:指定した文字
2.注:
3。

将每一个字节都设置成0
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	memset(arr, 0, 40);
	return 0;
}
公開された37元の記事 ウォンの賞賛3 ビュー1095

おすすめ

転載: blog.csdn.net/weixin_43264873/article/details/102999186