連載記事カタログ:文字関数・文字列関数の詳細解説(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の利用
memmoveもmemcpyと同じメモリ コピー関数ですが、違いは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;
}
注: どんなに一生懸命働いても、あなたは可能な限り特別になります。