ホームページ
まだまだ未知の部分が探索を待っている_データ構造、C言語の難しさ、小規模プロジェクト - CSDNブログ
トピックコラム---C言語の難しさ
C 言語の難しさ_探索を待っている未知のブログがまだあります - CSDN ブログ
ご協力ありがとうございました!!!
目次
3. 文字列追加関数(strcat)の長さに制限はありません
4. 文字列比較関数(strcmp)の長さに制限はありません
I.はじめに
日常的な使用では、文字列の長さの計算、文字列のコピーなど、文字列に対する操作が比較的頻繁に行われます。これらの関数の実装はそれほど面倒ではありませんが、いくつかのライブラリ関数を直接呼び出すことができれば、コード サイズの点で比較的簡単になります。さて、早速説明に入りましょう。
2. 説明
注: 次のライブラリ関数のヘッダー ファイルは string.h です。
1. 文字列長関数 (strlen) を見つけます。
1) 使用方法:
パラメータは、要求された文字列へのポインタです。
2)注意点:
strlen の終了条件は、'\0' の検出 ('\0' を除く) です。
戻り値の型は符号なし整数です (符号なし整数 - 符号なし整数は常に 0 以上です)。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "strstr";
char str2[] = "str\0str";
printf("str1:%d\n",strlen(str1));
printf("str2:%d\n",strlen(str2));
return 0;
}
2. 文字列コピー関数(strcpy)の長さに制限はない
1) 使用方法:
destination はコピー先の配列、source はコピーされる配列です。
2)注意点:
char* の宛先スペースは十分な大きさがあり、変更可能である必要があります。同様に、'\0' に遭遇すると終了します。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[7];//destination
char str2[] = "str\0str";//source
strcpy(str1, str2);
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
return 0;
}
3. 文字列追加関数(strcat)の長さに制限はありません
1) 使用方法:
ソース文字列を宛先に追加します。
2)注意点:
宛先のスペースサイズが十分である必要があることに注意してください。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[7]="str";
char str2[] = "str\0str";
strcat(str1, str2);
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
return 0;
}
4. 文字列比較関数(strcmp)の長さに制限はありません
1) 使用方法:
str1 と str2 を比較します。
2)注意点:
strcmp が比較するのは文字列の長さではなく、その ASCII コード値です。(str1 の最初の文字と str2 の最初の文字の ASCII コード値を比較します。小さい場合は <0 を返し、大きい場合は >0 を返します。等しい場合は次の文字を比較し、上記と同様にします。 )
#include<stdio.h>
#include<string.h>
int main()
{
//判断str1和str2的大小关系,并打印大小关系符
char str1[7] = "str";
char str2[] = "str\0str";
int ret = strcmp(str1, str2);
if (ret > 0)
printf(">");
else if (ret < 0)
printf("<");
else
printf("=");
return 0;
}
5. 文字列関数(strstr)の長さに制限はありません
1) 使用方法:
str1 に文字列 str2 が含まれるかどうかを検索し、str1 で返された文字列のアドレスを見つけます。
2)注意点:
strstr(str1,str2) の戻り値を使用または処理する前に、str1 文字列を変更しないように注意してください。変更する場合は、戻り値が使用されるまで待つ必要があります。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[7] = "strcmp";
char str2[] = "str";
char*ret = strstr(str1, str2);
if (ret == NULL)
printf("未找到\n");
else
{
printf("%s", ret);
}
return 0;
}
3. 個別の実装
1. 文字列の長さを求める関数の実装(strcpy)
この関数の実装は比較的単純で、さまざまな方法で実装できます。
1. ループ
#include<stdio.h> int my_strlen2(char* arr) { int i = 0; while (*(arr + i) != '\0')//如果遇到'\0'结束,'\0'不算作字符串长度 i++; return i; } int main() { char arr[] = "abcdef"; int ret2 = my_strlen2(arr); printf("迭代:%d\n", ret2); return 0; }
2. 再帰
#include<stdio.h> int my_strlen1(char* arr) { if (*arr != '\0') return 1 + my_strlen1(arr + 1); else return 0; } int main() { char arr[] = "abcdef"; int ret1 = my_strlen1(arr); printf("%d\n", ret1);//递归: return 0; }
3. ポインタ演算
2 つのポインタの減算は、メモリ内の 2 つのアドレス間のポインタ タイプのバイト倍数に等しくなります。どちらのポインターも文字配列を指しているため、配列は連続しており、要素の数を表すことができます。
#include<stdio.h> char* my_strlen(char* arr) { char*p=arr; while(*p!='\0') p++; return p; } int main() { char arr[] = "abcdef"; char* ret = my_strlen(arr); printf("%d\n", ret-arr); return 0; }
2. その他は自分で実装可能
ヒント: strstr の暴力的な解決法に加えて、KMP アルゴリズムを使用することもできます。