Усечение и удаление символов из массива символов C ++

0

У меня в основном есть txt файл, который выглядит так...

High Score: 50
Player Name: Sam
Number Of Kills: 5
Map
Time

Я хочу сохранить все до : или пробела после Map и Time в один массив и все после другого. Как для Map и для Time, после этого нет ничего, поэтому я хочу сохранить пробел как null.

До сих пор мне удалось прочитать и сохранить всю эту информацию в массиве temp. Тем не менее, это отделяет меня от проблем. Это мой код:

istream operator >> (istream &is, Player &player)
{
  char **temp;
  char **tempNew;
  char lineInfo[200]
  temp = new char*[5];
  tempNew = new char*[5];
  for (int i=0; i<5; i++)
  {
    temp[i] = new char[200];
    is.getline(lineInfo, sizeof(lineInfo));
    int length = strlen(lineInfo);
    for (int z=0; z < length; z++)
    {
      if(lineInfo[z] == '= ' ){  //HOW DO I CHECK IF THERE IS NOTHING AFTER THE LAST CHAR
        lineInfo [length - (z+1)] = lineInfo [length];
        cout << lineInfo << endl;
        strncpy(temp[i], lineInfo, sizeof(lineInfo));
      }
      else{
        tempNew[i] = new char[200];
        strncpy(tempNew[i], lineInfo, sizeof(lineInfo));
    }
  }
}
  • 2
    Вы new но вы никогда не delete [] , что приведет к утечке памяти. Вместо этого используйте std::string и std::vector чтобы вам не нужно было выделять память напрямую (и тогда вам также не нужно использовать строковые функции C).
Теги:
arrays
char

2 ответа

0

Если вам нужно найти ":"

#include <cstring>

и просто auto occurance = strstr(string, substring);

Документация здесь.

если occension не является нулевым ptr, то посмотрите, находится ли в конце строки строка get get. Если нет, то ваше значение будет после этого:

  • 0
    Благодарю. Как насчет пробелов? Например, после map нет двоеточия, но я хочу сохранить все после map как null . Был бы очень признателен, если бы вы могли помочь изменить мой код
  • 1
    Вы можете использовать функцию bool isspace (char c). Если честно, это очень связанный со строкой код, и было бы полезно перейти на c ++ #include <string>, если вы можете
Показать ещё 2 комментария
0

Гораздо проще с std::string.

// Read high score
int high_score;
my_text_file.ignore(10000, ':');
cin >> high_score;

// Read player name
std::string player_name;
my_text_file.ignore(10000, ':');
std::getline(my_text_file, player_name);  

// Remove spaces at beginning of string
std::string::size_type end_position;
end_position = player_name.find_first_not_of(" \t");
if (end_position != std::string::npos)
{
  player_name.erase(0, end_position - 1);
}

// Read kills
unsigned int number_of_kills = 0;
my_text_file.ignore(':');
cin >> number_of_kills;

// Read "Map" line
my_text_file.ignore(10000, '\n');
std::string map_line_text;
std::getline(my_text_file, map_line_text);

// Read "Text" line
std::string text_line;
std::getline(my_text_file, text_line);

Если вы настаиваете на использовании строк стиля C (массивы char), вам придется использовать более сложные и менее безопасные функции. Найдите следующие функции:

fscanf, strchr, strcpy, sscanf
  • 0
    спасибо за этот альтернативный метод. Поскольку мой код используется для высоких результатов в игре, я готов изучить новые альтернативы. Что касается моего подхода c style , как я могу заставить его делать то, что вы делали со string ?
  • 0
    Скомпилируйте как C ++, включите соответствующие заголовки. Читать хороший справочник по C ++?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню