циклы — оператор if (isspace ()) не работает Переполнение стека

Я работаю над функцией для моей программы, которая читает имя и фамилию из текстового файла и сохраняет их в виде двух строк. Однако я не могу заставить оператор if (isspace (next)) выполняться, когда цикл for достигает первого пробела между именами и фамилиями.

Вот полная программа

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <ctype.h>

using namespace std;

void calcAvg(ifstream& in, ofstream& out);

int main()
{
//open input and output file streams and check for any failures
ifstream input;
ofstream output;
input.open("lab08_in.txt");
output.open("lab08_out.txt");
if(input.fail())
{
cout << "Error: File not Found!" << endl;
exit(1);
}
if(output.fail())
{
cout << "Error: File creation failed!" << endl;
exit(1);
}
calcAvg(input, output);

return 0;
}

void calcAvg(ifstream& in, ofstream& out)
{
int sum = 0;
double average;

//save first and last name to strings
string firstname, lastname;
char next;
int i = 1;
in >> next;
for(; isalpha(next) && i < 3; in >> next)
{
if(i == 1)
{
firstname += next;
cout << next << " was added to firstname" << endl;
if(isspace(next))
{
cout << "Space!" << endl;
out << firstname << ' ';
i++;
}
}
else if(i == 2)
{
lastname += next;
cout << next << " was added to lastname" << endl;
if(isspace(next))
{
cout << "Space!" << endl;
out << lastname << ' ';
i++;
}
}
}
}

Часть кода, с которой у меня возникают проблемы,

 if(isspace(next))
{
cout << "Space!" << endl;
out << firstname << ' ';
i++;
}

Код должен (на мой взгляд) прочитать каждый символ из файла и добавить к строке, и как только он достигнет пробела, написать эту строку имя в выходной файл, но это не так, вместо этого я получаю этот вывод в консоли

H was added to firstname
e was added to firstname
s was added to firstname
s was added to firstname
D was added to firstname
a was added to firstname
m was added to firstname

так далее…

Обратите внимание, как имя должно быть Гесс Дам …. и что должно произойти, это спасает Гесс имя и дам … чтобы Фамилия. Вместо этого это просто добавление целиком до вкладки после фамилии в имя строка и никогда не записывает в выходной файл. Он читает вкладку, потому что выходит из цикла for (из isalpha (next)), но по какой-то причине аргумент isspace (next) не работает

1

Решение

Извините, у меня нет репутации, чтобы комментировать, но есть два неправильных ответа. Комментарий от Захир прав. std :: isspace (c, is.getloc ()) имеет значение true для следующего символа c в is (этот пробельный символ остается во входном потоке). Оператор >> никогда не вернет пробелы.

1

Другие решения

Вы проверяете, если next является альфа-символом в цикле for: for(; isalpha(next) && i < 3; in >> next),
Согласно документация, символ «пробел» не считается альфа-символом в локали C по умолчанию. Вы можете либо изменить свою локаль, чтобы обойти это, либо, более предпочтительно (на мой взгляд), изменить цикл for, чтобы также принимать пробелы.
Что-то вроде for(; (isalpha(next) || isspace(next)) && i < 3; in >> next) должен позволить циклу обрабатывать пространство вместе с альфа-символами

РЕДАКТИРОВАТЬ: Как отметили несколько других, я упустил тот факт, что использование здесь оператора >> приведет к тому, что вы никогда не увидите пробелы, поэтому мой ответ не полный. Я собираюсь оставить это на всякий случай, если это все еще может оказаться полезным.

1

Ваша проблема не с isspace функция, это с вашим for петля, вы заставляете for цикл для обработки только буквенных символов с помощью isalphaв этом случае персонаж не может быть iscntrl, isdigit, ispunct или же isspace). Взгляни на этот.

0
По вопросам рекламы [email protected]