C++ не понимаю откуда берётся мусор

111
01 августа 2019, 14:50

код:

#include <iostream>
#include <fstream>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
//help
  if (argc==1)
    std::cout << "use help to see info\n";
  else if (!strcmp(argv[1],"help"))
    std::cout << "./command input_file.txt output_file.txt\n";
  else
  {
    std::string filename = argv[1];
// открываем файловый поток
    std::fstream myfile(filename);
    if (myfile)
    {
// сообщение о успешном открытии потока
      std::cout << "OK!\n";
      while (!myfile.eof()) {
// обнуляю данные
        int startSpace=0, endSpace=0, sizeFW=0, sizeLW=0;
        std::string inner;
// беру строку
        getline(myfile, inner);
// ищу пробелы в начале и конце строки, а также размер первого и второго числа
        for (int i=0; inner[i]==' '; i++)
          startSpace++;
        for (int i=inner.size()-1; inner[i]==' '; i--)
          endSpace++;
        for (int i=startSpace; inner[i]=='0'||inner[i]=='1'||inner[i]=='2'||inner[i]=='3'||inner[i]=='4'||inner[i]=='5'||inner[i]=='6'||inner[i]=='7'||inner[i]=='8'||inner[i]=='9'; i++)
          sizeFW++;
        if (inner.size()>startSpace+endSpace+sizeFW){
          for (int i=inner.size()-(endSpace+1); inner[i]=='0'||inner[i]=='1'||inner[i]=='2'||inner[i]=='3'||inner[i]=='4'||inner[i]=='5'||inner[i]=='6'||inner[i]=='7'||inner[i]=='8'||inner[i]=='9'; i--)
            sizeLW++;
        }else{sizeLW=(-1);}
        std::cout << "исходная строка: |" << inner << "|\n\tвсего в строке " << inner.size() << " символов, перед строкой " << startSpace << " пробелов, после строки " << endSpace << " пробелов, первое слово из " << sizeFW << " букв, последнее слово из " << sizeLW << " букв\n";
// если в строке больше 1 слова
        if (sizeLW != (-1)){
          char* startPlace = new char[startSpace];
          for (int i=0; i<startSpace; i++)
            startPlace[i] = ' ';
          char* endPlace = new char[endSpace];
          for (int i=0; i<endSpace; i++)
            endPlace[i] = ' ';
          char* newFirstWord = new char[sizeFW];
          for(int i=inner.size()-sizeLW-endSpace; i<inner.size()-endSpace; i++)
            newFirstWord[i-(inner.size()-sizeLW-endSpace)] = inner[i];
          char* newLastWord = new char[sizeLW];
          for(int i=startSpace; i<startSpace+sizeFW; i++)
            newLastWord[i-startSpace] = inner[i];
          char* newMidleLine = new char[inner.size()-sizeFW-sizeLW-startSpace-endSpace];
          for(int i=startSpace+sizeFW; i<inner.size()-sizeLW-endSpace; i++)
            newMidleLine[i-(startSpace+sizeFW)] = inner[i];
          std::cout << "startPlace: |" << startPlace << "|\n";
          std::cout << "newFirstWord: |" << newFirstWord << "|\n";
          std::cout << "newMidleLine: |" << newMidleLine << "|\n";
          std::cout << "newLastWord: |" << newLastWord << "|\n";
          std::cout << "endPlace: |" << endPlace << "|\n";

          printf("\n меняю на |%s%s%s%s%s|\n", startPlace, newFirstWord, newMidleLine, newLastWord, endPlace);
          delete[] startPlace; delete[] newFirstWord; delete[] newMidleLine; delete[] newLastWord; delete[] endPlace;
        }
      }
    }else{
//сообщение об ошибке открытия потока
      std::cout <<"ERROR!\n";}}
  return 0;
}

файл:

123 4566   
   112233 4567 7890
2143567
1 2 3 4 5 6 7 8 9 0

вывод:

OK!
исходная строка: |123 4566   |
    всего в строке 11 символов, перед строкой 0 пробелов, после строки 3 пробелов, первое слово из 3 букв, последнее слово из 4 букв
startPlace: ||
newFirstWord: |4566|
newMidleLine: | |
newLastWord: |123|
endPlace: |   |
 меняю на |4566 123   |
исходная строка: |   112233 4567 7890|
    всего в строке 19 символов, перед строкой 3 пробелов, после строки 0 пробелов, первое слово из 6 букв, последнее слово из 4 букв
startPlace: |   1�U|
newFirstWord: |7890�U|
newMidleLine: | 4567 |
newLastWord: |112233|
endPlace: |@��1�U|
 меняю на |   1�U7890�U 4567 112233@��1�U|
исходная строка: |2143567|
    всего в строке 7 символов, перед строкой 0 пробелов, после строки 0 пробелов, первое слово из 7 букв, последнее слово из -1 букв
исходная строка: |1 2 3 4 5 6 7 8 9 0|
    всего в строке 19 символов, перед строкой 0 пробелов, после строки 0 пробелов, первое слово из 1 букв, последнее слово из 1 букв
startPlace: ||
newFirstWord: |0��1�U|
newMidleLine: | 2 3 4 5 6 7 8 9 |
newLastWord: |1��1�U|
endPlace: |���1�U|
 меняю на |0��1�U 2 3 4 5 6 7 8 9 1��1�U���1�U|
исходная строка: ||
    всего в строке 0 символов, перед строкой 0 пробелов, после строки 0 пробелов, первое слово из 0 букв, последнее слово из -1 букв

с каждым запуском программы мусор разный, но повторяется во всех строках.

READ ALSO
Функции вызывают друг друга с++

Функции вызывают друг друга с++

Я совсем поверхностно знаю с++, но эту проблему мне необходимо срочно решить(нет времени на прочтение книги)

98
Global Libraries как зависимость Gradle в IDEA

Global Libraries как зависимость Gradle в IDEA

Есть некие глобальные библиотеки заданные в IDEA, могу ли я их подключить в buildgradle? Если я подключаю их вручную, то они сбрасываются при первом...

122
Массив огромных размеров [закрыт]

Массив огромных размеров [закрыт]

Есть олимпиадная задача, ограничение по памяти 256 мебибайтНужно создать матрицу 100000 х 100000

94