char *myString = "Hello-World!";和 char myString[] = "Hello-World!";

20)下列语句中,正确的是(A)。

Achar*myString="Hello-World!";

Bchar myString="Hello-World!";

Cchar myString[11]="Hello-World!";

Dchar myString[12]="Hello-World!";

【答案】A

定义Char字符型变量时,不能直接把字符串"Hello-World!"赋值给myString,所以B是错误的。

关于CD,编译会报错error C2117: 'Hello-World!' : array bounds overflow数组溢出,若下标改为13或者以上则为对,即可以写为char myString[13]="Hello-World!";也可以写为:char myString[] = "Hello-World!";

 

char *myString  = "Hello-World!";和 char myString[] = "Hello-World!";两者之间有什么差别?

两者没有什么很大的区别 ,除了 sizeof(myString)两者返回的值不同,

 

char *myString  = "Hello-World!";是定义了一个指向字符串"Hello-World!"的首地址的指针。

"Hello-World!"作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址,而程序本身知道。

 

char myString[13]="Hello-World!";是定义了一个字符型数组。

当某一函数以char myString[] = "Hello-World!";方式使用此静态字符串时,实际上相当于:
char myString;
strcpy(myString, "Hello-World!");
myString[13]是在栈里临时分配的。虽然myString指向的内容是"Hello-World!"但是这是复制品,不是原件。当函数结束,charmyString[]就被程序回收了,所以myString[]的内容就不再是"Hello-World!"了。
但如果以char *myString="Hello-World!";的方式使用,myString指向的是静态字符串存储的位置,也就是说指向"Hello-World!";的原件。

如果想坚持用char myString[]而不使用char *myString, 能保证str为"Hello-World!"有效方法必须是:
{
static char myString[]="Hello-World!";

return myString;
}

static char []是静态的,存储在数据区。

 

应用举例,如何将两个char*类型字符串连接?

#include <iostream>
using namespace std;

int main() 
{
	char   str3[20]; 
	char*   str1="Hello   ";  
	char*   str2="World!";  
	strcpy(str3,str1);  
	strcat(str3,str2);  
	char*   str=str3;
	cout<<str1<<endl;
	cout<<str2<<endl;
	cout<<str<<endl;

    return 0;
}

 

测试结果:

 

 

题外话:char型变量中能不能存储一个中文汉字,为什么?

C/C++ 里面不能用char型变量存储中文汉字,因为char 只占一个字节, 汉字为两个字节。

C++中char类型只能保存单个字符。如:char s = 's';  char i = '1';

而汉字通常是两个字节来表示,不过我们可以使用char数组来表示汉字。例如char a[5]="你";

不过,在C#和java里面char为两个字节,因为C#char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储一个汉字。


 

下面是 MyString 类的实现代码: ```cpp class MyString { public: MyString() : m_buf(nullptr), m_size(0) {} // 默认构造函数 MyString(const char* str) { // 带参构造函数 m_size = strlen(str); m_buf = new char[m_size + 1]; strcpy(m_buf, str); } MyString(const MyString& other) { // 拷贝构造函数 m_size = other.m_size; m_buf = new char[m_size + 1]; strcpy(m_buf, other.m_buf); } ~MyString() { // 析构函数 delete[] m_buf; } MyString& operator+=(const MyString& s) { // 字符串拼接 int new_size = m_size + s.m_size; char* new_buf = new char[new_size + 1]; strcpy(new_buf, m_buf); strcat(new_buf, s.m_buf); delete[] m_buf; m_buf = new_buf; m_size = new_size; return *this; } char& operator[](int pos) { // 下标运算符 if (pos < 0 || pos >= m_size) { throw "Out of range!"; } return m_buf[pos]; } MyString substr(int pos = 0, int count = -1) { // 子串 if (pos < 0 || pos >= m_size) { return MyString(); } if (count == -1) { count = m_size - pos; } if (pos + count > m_size) { count = m_size - pos; } char* new_buf = new char[count + 1]; strncpy(new_buf, m_buf + pos, count); new_buf[count] = '\0'; MyString res(new_buf); delete[] new_buf; return res; } int size() const { // 长度 return m_size; } const char* c_str() const { // C 语言风格的字符串 return m_buf; } private: char* m_buf; int m_size; }; ``` 使用示例: ```cpp MyString s1("Hello, "); MyString s2("world!"); s1 += s2; std::cout << s1.c_str() << std::endl; // 输出 "Hello, world!" MyString s3("abcdefg"); std::cout << s3[2] << std::endl; // 输出 'c' MyString s4("0123456789"); MyString s5 = s4.substr(2, 5); std::cout << s5.c_str() << std::endl; // 输出 "23456" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值