我正在尝试创建一个读取字符串的循环,只要它不为空,如果它不包含任何字符,则退出循环;但我无法得到它,它保持在一个循环中并且永远不会退出,这是我的代码:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int main(){
string nombre;
cout<<"ingrese una palabra "; cin>>nombre;
while (nombre[0] !='\0'){
cout<<nombre<<endl;
cout<<"ingrese una palabra "; cin>>nombre;
}
}
我的问题是在 while 条件下(nombre[0] !='\0')
显然由于某种原因没有阅读它。
为什么不满足这个条件?
谢谢。
要确定一个类型的对象是否
std::string
为空,您可以使用多种选择:length
:此方法返回字符数。如果对象为空,则长度为零:size
: 这个方法相当于length
。的存在size
是合理的,因此std::string
它可以与容器函数(std::vector
,std::set
等...)一起使用empty
:此方法返回一个布尔值,指示对象是否为空......简单明了,它完全符合您的要求。迭代器:好的,这不是最正统的方法,但就此而言,它是一种验证字符串是否为空的不同方法:
最简单的方法是
Elnombredetustring.empty()
把它if
放在一些例子中:对于您的问题,为什么您尝试这样做的方式不起作用是因为它可以像您展示的那样工作:
这意味着名称的值为 0,而不是 null,也就是说,您必须将字符串与 0 的 char 匹配,但这并不意味着它是空的。
您可以尝试使用 TextIsEmpty,
或将其与定义为零的值放在一起
如果你依赖那个条件,你就有麻烦了。
如果
std::string
为空,它将没有元素,没有元素。因此,通过访问std::string
void 的第一个元素,您将导致未定义的行为。所以它可能会陷入循环并且永远不会退出,或者它可能会引发运行时错误,或者可能会从你的鼻孔中产生守护进程。该值被读取,但我们在上一段中描述了它将是一个不确定的值,可能几乎永远不会
'\0'
,因此即使它实际上std::string
是空的,也几乎永远不会退出循环。描述了您面临的问题后,让我们继续讨论解决方案。如果我们查阅文档
std::string
,我们会发现它有几个与其容量相关的功能:empty
: 检查字符串是否为空。size
,length
: 返回存储的字符数。max_size
:返回字符串在不超过库或实现限制的情况下可以存储的最大字符数。reserve
:预留内存以存储更多字符。capacity
:返回为该字符串保留的内存,无论它是否包含数据。shrink_to_fit
:减少链保留的内存,使其与包含数据的内存相等。size
在您的情况下,只有,length
和函数是相关empty
的,您可以按如下方式使用:size
整数值可以隐式转换为布尔条件,即被解释为的值和被
0
解释为的false
任何其他值true
;所以:如果它size
返回一个不是 的值0
,它将停留在循环中,完全相同的事情发生在:length
最后,我们也可以用函数判断它是否为空
empty
,但它需要我们反转检查(因为我们希望循环只要它不为空就继续):empty
您可以尝试
nombre.IsEmpty()
根据字符串是否为空来输入返回 true 或 false 的 if。您也可以尝试使用strlen(nombre) == 0
,strlen 所做的是计算字符串的索引数(或字符串的长度)。我希望它对你有帮助。