C/C++ 文字列関数はどのような型で、どのように変換されますか?例えば
字符串函数之间的转换,首先要先了解C++字符串的组成,C++提供了两种字符串的表示:C 风格的字符串和标准 C++引入的 string 类类型。
1. C 风格字符串
C 风格的字符串起源于 C 语言 并在 C++中继续得到支持。字符串被存储在一个字符数组中 一般通过一个 char*类型的指针来操纵它 。
标准 C 库为操纵 C 风格的字符串提供了一组函数,例如:
int strlen( const char* ); // 返回字符串的长度
int strcmp( const char*, const char* ); // 比较两个字符串是否相等
char* strcpy(char*, const char* ); // 把第二个字符串拷贝到第一个字符串中
标准 C 库作为标准的 C++的一部分被包含在其中。为使用这些函数,我们必须包含相关的 C 头文件#include
1.1 不调用库函数,实现C风格字符串的常用基本函数
#include<iostream> #include<cstring> #include<cassert> using namespace std; /*返回字符串长度*/ int MyStrlen(const char * ch) { assert(ch!=NULL); int i=0,count=0; const char *t=ch; //用一个临时指针去遍历,防止改变原来指针指向。 while(t[i]!='\0') { count++; i++; } return count; } /*把第二个字符串拷贝到第一个字符串中,返回第一个字符串的首部指针。*/ char* MyStrcpy(char *des,const char *src) { assert((des!=NULL)&&(src!=NULL)); int i=0; char *add=des; //用add记录des的首部。 while(src[i]!='\0') { des[i]=src[i]; i++; } des[i]='\0'; return add; } /* 比较两个字符串是否相等。 相等则返回0,前一个字符串比后一个小则返回-1,否则返回1。 */ int MyStrcmp(const char *ch1,const char *ch2) { assert((ch1!=NULL)&&(ch2!=NULL)); int i=0; const char *str1=ch1; //定义两个临时指针。 const char *str2=ch2; while((str1[i]!='\0')||(str2[i]!='\0')) { if(str1[i]<str2[i]) { return -1; } else if(str1[i]>str2[i]) { return 1; } else { i++; } } return 0; } int main() { char ch[]="cavely"; char ch2[]="julia"; cout<<MyStrlen(ch)<<endl; //6 cout<<MyStrcmp(ch,ch2)<<endl; //-1 /* 下面这两句不能写成: char ch3[100]; ch3=MyStrcpy(ch,ch2); //数组名是一个地址【常量】。不能被赋值 */ char *ch3; ch3=MyStrcpy(ch,ch2); cout<<ch3<<endl; //julia return 0; }
2.string 类类型
要使用 string 类型 必须先包含相关的头文件#include
string str("hello"); //①定义一个带初值的字符串
string str2; // ②定义空字符串
string str3( str ); //③用一个 string 对象来初始化另一个 string 对象
2.1 对字符串类的基本操作:
(1)str的长度由 size()操作返回(不包含终止空字符),例如str.size()的值为5。
(2)使用 empty()操作判断字符串是否为空,例如:str2.empty()。如果字符串中不含有字符,则 empty()返回布尔常量 true ,否则返回 false。
(3)还可以直接使用赋值操作符 = 拷贝字符串,例如:st2 = st3; // 把 st3 拷贝到 st2 中
(4)可以使用加操作符 + 或看起来有点怪异的复合赋值操作符 += 将两个或多个字符串连接起来。例如,给出两个字符串
string s1( "hello, " );
string s2( "world\n" );
我们可以按如下方式将两个字符串连接起来形成第三个字符串
string s3 = s1 + s2;
如果希望直接将 s2 附加在 s1 后面 那么可使用 += 操作符
s1 += s2;
(5)string 类型支持通过下标操作符访问单个字符,例如,在下面的代码段中,字符串中的所有句号被下划线代替。
string str( "fa.disney.com" ); int size = str.size(); for ( int ix = 0; ix < size; ++ix ) if ( str[ ix ] == '.' ) str[ ix ] = '_';
上面代码段的实现可用如下语句替代:
replace( str.begin(), str.end(), '.', '_' );
replace()是泛型算法中的一个,begin()和 end()操作返回指向 string 开始和结束处的迭代器(iterator) 。迭代器是指针的类抽象 ,由标准库提供。replace()扫描 begin()和 end()之间的字符。每个等于句号的字符,都被替换成下划线。
2.2 C 风格的字符串与 string 对象的转换
string 类型能够自动将 C 风格的字符串转换成 string 对象。例如,这使我们可以将一个 C 风格的字符串赋给一个 string 对象。
string s1;
const char *pc = "a character array";
s1 = pc; //OK
但是,反向的转换不能自动执行。对隐式地将 string 对象转换成 C 风格的字符串 string类型没有提供支持。例如下面,试图用 s1 初始化 str 就会在编译时刻失败。
char *str = s1; // 编译时刻类型错误
为实现这种转换,必须显式地调用名为 c_str()的操作。名字 c_str()代表了 string 类型与 C 风格字符串两种表示法之间的关系。字面意思是,给我一个 C 风格的字符串表示——即 指向字符数组起始处的字符指针。为了防止字符数组被程序直接处理, c_str()返回了一个指向常量数组的指针 const char*
所以,正确的初始化应该是:const char *str = s1.c_str(); // OK
相关推荐:
以上がC/C++ 文字列関数はどのような型で、どのように変換されますか?例えばの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C#.NETは、複数のアプリケーション開発をサポートする強力なツールとライブラリを提供するため、依然として重要です。 1)C#は.NETフレームワークを組み合わせて、開発を効率的かつ便利にします。 2)C#のタイプの安全性とゴミ収集メカニズムは、その利点を高めます。 3).NETは、クロスプラットフォームの実行環境とリッチAPIを提供し、開発の柔軟性を向上させます。

c#.netisversatileforbothwebanddesktopdevelopment.1)forweb、useasp.netfordynamicapplications.2)fordesktop、equindowsorwpfforrichinterfaces.3)usexamarinforcross-platformdeveliment、enabling deshacrosswindows、

C#は、エンタープライズレベルのアプリケーション、ゲーム開発、モバイルアプリケーション、Web開発で広く使用されています。 1)エンタープライズレベルのアプリケーションでは、C#がasp.netcoreにWebAPIを開発するためによく使用されます。 2)ゲーム開発では、C#がUnityエンジンと組み合わされて、ロールコントロールやその他の機能を実現します。 3)C#は、コードの柔軟性とアプリケーションのパフォーマンスを改善するために、多型と非同期プログラミングをサポートします。

c#.netアプリをAzureまたはAWSに展開する方法は?答えは、AzureAppServiceとAwselasticBeanStalkを使用することです。 1。Azureでは、AzureAppServiceとAzurePipelinesを使用して展開を自動化します。 2。AWSでは、Amazon ElasticBeanstalkとAwslambdaを使用して、展開とサーバーレス計算を実装します。

C#と.NETランタイムは密接に連携して、開発者に効率的で強力なプラットフォームの開発機能に力を与えます。 1)C#は、.NETフレームワークとシームレスに統合するように設計されたタイプセーフおよびオブジェクト指向のプログラミング言語です。 2).NETランタイムは、C#コードの実行を管理し、ガベージコレクション、タイプの安全性、その他のサービスを提供し、効率的でクロスプラットフォームの操作を保証します。

C#.NET開発を開始するには、次のことが必要です。1。C#の基本的な知識と.NETフレームワークのコア概念を理解する。 2。変数、データ型、制御構造、関数、クラスの基本概念をマスターします。 3。LINQや非同期プログラミングなど、C#の高度な機能を学習します。 4.一般的なエラーのためのデバッグテクニックとパフォーマンス最適化方法に精通してください。これらの手順を使用すると、C#.NETの世界に徐々に浸透し、効率的なアプリケーションを書き込むことができます。

.NETを使用してアプリケーションを構築する方法は? .NETを使用してアプリケーションを構築することは、次の手順を通じて達成できます。1)C#言語やクロスプラットフォーム開発サポートを含む.NETの基本を理解します。 2)コンポーネントや.NETエコシステムの作業原則などのコア概念を学習します。 3)単純なコンソールアプリケーションから複雑なWebAPISおよびデータベース操作まで、基本的および高度な使用をマスターします。 4)構成やデータベース接続の問題など、一般的なエラーとデバッグ手法に精通している。 5)アプリケーションのパフォーマンスの最適化と非同期プログラミングやキャッシュなどのベストプラクティス。

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。
