关于string类型的字符串是否以\0结尾

本文探讨了C++中string类型是否以结尾的问题,发现其行为依赖于不同的编译器。文中提供了测试代码,并指出C++11标准对此有明确规定。

今天在带大一学生C++上机时,涉及到一个string类型的字符串是否以\0结尾的问题,本来我很坚定string类型结尾并没有\0,C风格的字符数组才会那样。但是程序运行结果却说明string类型的字符串后面确实有\0。


于是回实验室后自己又实验了下,才发现这和编译器有关,真坑爹。

对于如下一段测试程序,在C-free 5.0和g++ 4.1上输出yes,而在VS2010上执行时报错!

  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     string str="x";  
  7.     if(str[1]=='\0')  
  8.         cout<<"yes";  
  9.     else  
  10.         cout<<"no";  
  11.     return 0;  
  12. }  
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str="x";
	if(str[1]=='\0')
		cout<<"yes";
	else
		cout<<"no";
	return 0;
}
VS报错如下图:


当把上面代码中str[1]改成str[2]时,VS2010依然报错,但C-free 5.0输出了no,而g++ 4.1还是输出yes


另外,在网上查资料时发现:

全局的std::getline返回std::string,这个不一定是'\0'结尾。有的编译器会加,有的编译器不会加。但是,注意:新的C++标准C++11里面规定std::string一定是以'\0'结尾,就看你的编译器有没有实现新标准了。

istream::getline返回c字符数组,这个一定是'\0'结尾。

### 判断字符串是否以特定字符或子字符串结尾的方法 在不同编程语言中,判断字符串是否以特定字符或子字符串结尾的方法有所不同。以下是一些常见编程语言的实现方式。 #### C++ 在C++中,可以通过自定义函数来判断字符串是否以特定子串结尾。例如,定义一个函数`endsWith`,它接受一个字符串和一个后缀子串作为参数,并返回布尔值表示是否匹配: ```cpp #include <string> bool endsWith(const std::string& str, const std::string& suffix) { if (str.length() < suffix.length()) { return false; } return str.compare(str.length() - suffix.length(), suffix.length(), suffix) == 0; } ``` 此函数首先检查字符串长度是否足够长以包含给定的后缀,然后使用`compare`方法从字符串末尾开始比较[^1]。 #### Java (Android 开发) 在Java中,尤其是Android开发,可以利用`String`类提供的`endsWith`方法直接判断字符串是否以指定的子串结束: ```java String myString = "Hello World"; boolean result = myString.endsWith("World"); // 返回true ``` 这个方法简洁且易于使用,适用于大多数需要判断字符串结尾的情况[^2]。 #### Python Python 提供了多种方式来判断字符串是否以特定子串结尾。最常用的是`str.endswith()`方法: ```python my_string = "Hello World" result = my_string.endswith("World") # 返回True ``` 此外,还可以通过切片操作结合字符串长度进行比较,但这通常不如内置方法直观和高效[^3]。 #### JavaScript JavaScript中没有直接等同于`endswith`的方法,但可以通过正则表达式或者自定义函数来实现类似功能: ```javascript function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } var myString = "Hello World"; console.log(endsWith(myString, "World")); // 输出true ``` 此函数使用了`indexOf`方法,从字符串倒数指定后缀长度的位置开始查找,如果找到则返回`true`[^4]。 ### 总结 不同的编程语言提供了各自的方式来判断字符串是否以特定字符或子字符串结尾。选择合适的方法取决于具体的编程环境和个人偏好。对于C++,可能需要编写自定义函数;而对于像Java、Python和JavaScript这样的高级语言,则提供了内置方法简化这一过程。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值