Есть программа со строками, в которой ничего не понимаю, знаю только, что она делает
Сейчас, наверное будет максимально тупой вопрос. Вот сама программа, которая форматирует текст, чтобы каждая строка содержала одно предложение и удалялись лишние пробелы - это один аутпут. Второй аутпут это отформатированный текст выводит слова задом наперед. Так вот тот самый тупой вопрос: В каком месте кода прописано про задом наперед? Пожалуйста, не нужно писать про мою тупость, и так знаю
#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const char* separators = "\n !@:?#$%^&*()_+{}\\|/,.!-";
bool isSeparator(char ch)
{
for (int i=0;i<strlen(separators);i++)
if (separators[i]==ch) return true;
return false;
}
bool isNumeric(char ch)
{
return (ch>='0' && ch<='9');
}
string reverse_content(const char* charstr)
{
string result="";
for (int i=strlen(charstr)-1;i>=0;i--)
result+=charstr[i];
return result;
}
int process_data(string input_filename,string output_filename,bool reverse=false)
{
ifstream ifile(input_filename);
ofstream ofile(output_filename);
string word;
string line;
string new_line;
if (ifile.is_open())
{
if (!ofile.is_open()) return 0;
while ( getline (ifile,line) )
{
word = "";
new_line = "";
//
char* str = (char*)line.c_str();
int len=strlen(str);
char prev_c='\n';
for (int i=0;i<=len;i++)
{
char c=i<len?str[i]:'\n';
if (isSeparator(c))
{
if (c==' ' && ((word.length()==0 && new_line.length()==0) || prev_c==' '))
{
// пробелы в начале или несколько пробелов между словами - ничего не делаем
} else
if (c=='-' && i+1!=len && isNumeric(str[i+1]))
{
// это число со знаком минус
word+=c;
} else
{
if (word.length()>0)
{
if (reverse)
{
word = reverse_content(word.c_str());
}
new_line+=word;
}
if (c=='.' && prev_c == ' ')
{
// нужно удалить пробел перед точкой
new_line.erase(new_line.length()-1);
}
if (c!='\n') new_line+=c;
if (c=='.' || c=='\n')
{
if (new_line.length()>0 && new_line!=".") ofile << new_line << '\n';
new_line="";
word="";
}
word = "";
}
} else word+=c;
prev_c = c;
}
if (new_line.length()>0)
ofile << new_line;
}
} else return 0;
ifile.close();
ofile.close();
return 1;
}
int main(){
setlocale(LC_ALL,"Rus"); // Подключение русского языка
string input = "input.txt";
string output1 = "output.txt";
string output2 = "output2.txt";
int res=process_data(input,output1,false);
if (res)
{
cout<<input<<" to "<<output1<<" - OK\n";
} else
{
cout<<input<<" to "<<output1<<" - ERROR\n";
return 0;
}
res=process_data(output1,output2,true);
cout<<output1<<" to "<<output2<<" - "<<(res?"OK\n":"ERROR\n");
return 0;
}
Ответы (2 шт):
Разберите внимательно вот этот фрагмент кода:
string reverse_content(const char* charstr)
{
string result="";
for (int i=strlen(charstr)-1;i>=0;i--)
result+=charstr[i];
return result;
}
Обратите внимание на цикл for. Он перебирает символы входной строки и добавляет их в результирующую. Эту задачу выполняет вот эта строка:
result+=charstr[i];
А то, как построено условие цикла:
i=strlen(charstr)-1;i>=0;
определяет, что перебор входной строки выполняется от конца к началу. К результирующей строке символы добавляются в порядке перебора, чтьо обеспечивает разворот строки.
Вот это:
string reverse_content(const char* charstr)
{
string result=""; // то куда будет записан результат
for (int i=strlen(charstr)-1;i>=0;i--) // с конца charstr строки в начало result записывается
result+=charstr[i]; //реверс
return result; // ну тут понятно
}