Я пытаюсь создать цикл, который читает строку, если она не пуста, если она не содержит символов, то цикл завершается; но я не смог его получить, он остается в цикле и никогда не выходит, вот мой код:
#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, а не то, что оно нулевое, то есть вам пришлось бы сопоставлять строку с символом 0, но это не означает, что оно пустое.
Вы можете попробовать с 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()
if, который возвращает true или false в зависимости от того, пуста строка или нет. Вы также можете попробовать использоватьstrlen(nombre) == 0
, что делает strlen, так это подсчитывает количество индексов строки (или длину строки). Я надеюсь, что это поможет вам.