文字関数と文字列関数の詳細解説(3) strerror memcpy memmove memset memcmp (および一部の文字分類関数)

連載記事カタログ:文字関数・文字列関数の詳細解説(1)
strlen strcpy strcat
strcmp


今号では主にエラー情報の印刷機能と メモリ操作機能 を紹介し、キャラクター操作機能についても簡単に紹介します(使いこなせるようになります)

1. エラーメッセージレポート

ストエラー関数の使用

エラー コード 0 1 2 3 4 はC 言語で定義されており、その出力結果は次の図のようになります: エラーコード情報
errnoは C 言語で提供されるグローバル エラー変数です。これを使用する場合、ヘッダー ファイル #include <errno .h> を含める必要があります。関数を使用してエラーを報告する場合、対応するエラー コードがerrnoに割り当てられます。このとき、strerror関数を使用して、対応するエラー メッセージを出力できます。
コード例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<String.h>
#include <errno.h>
int main()
{
    
    

	FILE* pf = fopen("test.txt", "r");
	
		if (pf == NULL)
		{
    
    
			perror("fopen:");   //稍后再说
			printf("%s\n", strerror(errno));//打印的是errno变量中错误码对应的错误信息
			return 1;
		}	
		//读文件
		fclose(pf);
		pf = NULL;
		return 0;
	
}

実行結果:注意深い友人は、私がコード内でperror("fopen:");
演算結果
を使用していることに気づくでしょう。実際、perror 関数は、エラー メッセージに説明を追加するために使用されており、「説明情報 + strerror(」として理解できます。エラー番号);"ここに画像の説明を挿入

2. メモリ操作機能

1.memcpy

void* memcpy ( void*宛先、const void*ソース、size_t num );

(1) memcpyの使用

memcpy 関数をメモリ コピー関数と呼びます。この関数は、numバイトの値を、 sourceが指す位置からdestinationが指すメモリ ブロックに直接コピーします。
コード例:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

int main()
{
    
    
	int destination[10] = {
    
     0 };
	int source[10] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	memcpy(destination, source, 8);

	//float arr1[] = { 1.0f,2.0f,3.0f,4.0f };
	//float arr2[5] = { 0.0 };
	//memcpy(arr2, arr1, 8);

	return 0;
}

ここに画像の説明を挿入
ここに画像の説明を挿入
strcpyとは異なりmemcpy はメモリ単位でコピーし、終了マークとしてターミネータ\0を使用しません。つまり、memcpy には終了マークがないため、終了する前にnumに直接コピーします
また、memcpy は、重複する 2 つのメモリ ブロックをコピーするのには使用されません。一般に、 memmove関数は、重複する 2 つのメモリ ブロックをコピーするために使用されます。次の関数では、メモリの重複とは何か、および memmove の使用方法を紹介します。

(2) memcpyのシミュレーション実装

void* My_memcpy(void* destination,const void* source, size_t num)
{
    
    
	assert(destination);
	assert(source);
	void* ret = destination;
	while (num--)
	{
    
    
		* ((char*)destination)++ = *((char*)source)++;
	}
	return ret;
}
int main()
{
    
    
	char arr[18] = "0000000000000000";
	char arr1[] = "abcdefg sd  a da  s da";
	printf("%s",My_memcpy(arr,arr1,6));
	return 0;
}

操作結果:
ここに画像の説明を挿入

2.メモムーブ

void* memmove ( void*宛先、const void*ソース、size_t num );

(1) memmoveの利用

memmovememcpyと同じメモリ コピー関数ですが、違いはmemmove がメモリ オーバーラップの状況に対処できることです。次に、メモリ オーバーラップの状況を紹介します。
ここに画像の説明を挿入
そのため、コピー中にメモリ オーバーラップがある場合は、memmove 関数を使用する必要があります。それを実装するために。
コード例:

#include<stdio.h>
#include<string.h>
int main()
{
    
    
	char arr1[] = "11223344556677";
	printf("%s", memmove(arr1, arr1+2, 6));
	return 0;
}

操作結果:
ここに画像の説明を挿入

(2) memmoveのシミュレーション実装

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<assert.h>

void* My_memmove(void* destination,const void* source,size_t num)
{
    
    
	assert(destination);
	assert(source);
	void* ret = destination;
	if (destination <= source)
	{
    
    
		while (num--)
		{
    
    
			*((char*)destination)++ = *((char*)source)++;
		}
	}
	else
	{
    
    

		while (num--)
		{
    
    
			char* des = (char*)destination + num - 1;
			char* sou = (char*)source + num - 1;
			*(des) = *(sou);
		}
	}


	return (char*)ret;
}


int main()
{
    
    
	char arr1[] = "11223344556677";
	printf("%s", My_memmove(arr1, arr1+2, 6));
	return 0;
}

操作結果:
ここに画像の説明を挿入

3.memset

void* memset ( void* ptr, int value, size_t num );

memsetの使用

memset は、コンピュータの C/C++ 言語の初期化関数です。この関数は、メモリ ブロックのすべての内容を指定された値に設定することであり、通常、この関数は新しく要求されたメモリを初期化します。この関数は、メモリのブロックに指定された値を埋めることであり、これは大きな構造体または配列をクリアする最速の方法です。
コード例:

#include <stdio.h>
#include <string.h>

int main ()
{
    
    
  char str[] = "abcdefg";
  memset (str,'-',6);
  puts (str);
  return 0;
}

操作結果:ここに画像の説明を挿入

4.memcmp

void* memcmp ( const void* ptr1, const void* ptr2, size_t num );

memcmpの使用

memcmp は 2 つのメモリ ブロックを比較するために使用されます。ptr1 が指すメモリ ブロックの前の数値バイトと、ptr2 が指す前の数値バイトを比較し、両方が一致する場合は 0 を返し、一致しない場合は 0 以外の値を返します。どちらの値が大きいかを示します。

戻り値 見せる
戻り値>0 2 つのメモリ ブロック内で一致しない最初のバイトは、ptr2 よりも ptr1 の方が低い値になります (unsigned char 値として評価された場合)。
戻り値=0 2 つのメモリ ブロックの内容は等しい
戻り値<0 両方のメモリ ブロックで一致しない ptr1 の最初のバイトの値が ptr2 の値より大きい (unsigned char 値として評価された場合)
コード例:
#include <stdio.h>
#include <string.h>
int main ()
{
    
    
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";
  int n;
  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
  
  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

操作結果:
ここに画像の説明を挿入

3. キャラクター機能

文字関数を使用する場合は、「#include <ctype.h>」をインクルードする必要があります。

1. 文字分類機能

写真は西安ビットテクノロジー教育有限公司から提供されました。

2. 文字変換機能

int to lower ( int c );
int toupper ( int c );

コード例:

#include <stdio.h>
#include <ctype.h>
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;
}

注: どんなに一生懸命働いても、あなたは可能な限り特別になります。

おすすめ

転載: blog.csdn.net/qq_64293926/article/details/127059868