Я пытаюсь преобразовать строку с пробелами в массив символов без пробелов.
Вот что я пробовал
string str;
cout << "Enter a string: ";
getline(cin, str);
int TempNumOne=str.size();
char Filename[100];
for (int a=0;a<=TempNumOne;a++)
{
cout<<str[a]<<endl;
if(str[a]!=' ')
Filename[a]=str[a];
}
cout<<Filename;
Вывод выглядит так
Enter a string: hello world
h
e
l
l
o
w
o
r
l
d
hello
Только hello
хранится. Почему это происходит и как мне это решить?
Это потому что:
if(str[a]!=' ')
Filename[a]=str[a];
В «Привет мире», str[4]
является o
, а также str[6]
является w
, Приведенный выше код будет: хранить o
в Filename[4]
и w
в Filename[6]
, вместо Filename[5]
, Компьютер делает только то, что вы говорите, а теперь то, что вы хотите, чтобы он делал. Ваша логика пропустила пробел, но все, что она сделала, это не скопировала его в соответствующую позицию в Filename
буфер. Этого недостаточно для выполнения данной задачи.
Чтобы сделать это правильно, вам нужно поддерживать отдельную переменную индекса, вызвать ее b
например, инициализировать его до 0, затем:
if(str[a]!=' ')
Filename[b++]=str[a];
и не забудьте обнулить Filename
, в конце.
Ваш Filename
массив не инициализирован. Это означает, что изначально он может содержать любые значения, включая нули (что, вероятно, и происходит).
Теперь рассмотрим ваш алгоритм — вы начинаете копировать данные до первого пробела, и вы пропускать его местоположение и продолжить со вторым словом. Пропуская, вы покидаете место, соответствующее месту в Filename
в своем первоначальном состоянии, то есть неинициализирован. Если исходное значение там 0, оно соответствует терминатору строки (\0
). Когда вы печатаете строку, анализ останавливается при обнаружении \0
, так что вы не видите остальные данные напечатаны.