Segmentation fault. Найти строку, содержащую запись самого большого целого числа в десятичной системе

122
21 октября 2021, 23:40
#include <cstddef>  // size_t 
#include <cstring>  // strrchr 
#include <iostream> 
#include <cctype>
using namespace std; 
// Особое значение координаты -- "не позиция". 
size_t const NPOS = -1; 
// Позиция в тексте: номер строки и колонки (позиция в строке). 
struct Text_position 
{ 
  size_t line = NPOS; // по умолчанию -- не позиция. 
}; 
// Проверка на равенство позиций в тексте (используется в тесте): 
inline bool operator==(Text_position const & a, Text_position const & b) 
{ 
  return a.line == b.line; 
} 

// ...и на неравенство: 
inline bool operator!=(Text_position const & a, Text_position const & b) 
{ 
  return !(a == b); 
} 
// Определить количество строк в тексте. 
size_t text_size(char const * const * text) 
{ 
  size_t size = 0; 
  while (*text++) 
    ++size; 
  return size; 
} 
// Решение задачи: поиск наибольшего числа в тексте. 
Text_position find_the_largest_number(char const * const * text) 
{ 
    size_t number = -1;
    // Идём с начала текста. 
    char max = 0;
    for (size_t line = 0; line < text_size(text); line++)
        for (size_t column = 0; column < strlen(text[line])-1 ; column++)
            if (isdigit(*text[column]))
                if (*text[column] > max)
                {
                    max = *text[column];
                    number = line;
                }
    if (number != -1)
        return {(number)}; 
    return {}; // будет { NPOS } -- символ не найден. 
} 

int test_find_the_largest_number() 
{ 
  char const * const text[] 
  { 
    "A l5ne", 
    "An1ot978her line", 
    "!@#$^!%", 
    "       ", 
    "Abcd 19921344",
    nullptr 
  }; 
  if (find_the_largest_number(text) != Text_position{ 3 }) 
    return 1; 
  if (find_the_largest_number(text) == Text_position{ 2 }) 
    return 2; 
  if (find_the_largest_number(text) != Text_position{ 1 }) 
    return 3; 
  if (find_the_largest_number(text) == Text_position{ 4 }) 
    return 4; 
  return 0; 
} 

int main() 
{ 
  cout << "test find_the_largest_number (should write 0): "; 
  cout << test_find_the_largest_number(); 
  return 0; 
} 
Answer 1

В коде много "странностей", но основная ошибка в том, что в функции поиска вы почему-то обращаетесь к text[column]. Это, разумеется, совершенно не правильно. text - это массив размера text_size(text) (5 в вашем примере) и обращаться к нему нужно по индексу line. У вас же происходит вылет за пределы массива.

Обращение к символам текста, согласно вашей задумке, должно выглядеть как text[line][column]. А у вас, по какой-то непонятной причине, используется *text[column]. Почему вдруг *text[column]?

Также не понятно, почему цикл column итерирует до strlen(text[line])-1, а не до strlen(text[line]). Почему вдруг -1?

Также, в заголовке вопроса сказано, что необходимо найти запись максимального числа. Ваш код даже не пытается этого делать. Ваш код ищет максимальную цифру.

READ ALSO
Call of overloaded is ambiguous при реализации своего алгоритма copy

Call of overloaded is ambiguous при реализации своего алгоритма copy

Есть самописное подобие stlСуть задачи - вектор пар (тоже самописные)

225
C++ Считалка. Проблема с зацикливанием

C++ Считалка. Проблема с зацикливанием

Пишу код под задачу со считалкой в строке и одномерным массивом с людьмиЧерез поток делю строку на слова и через while выполняю считалку один...

264
Полиморфизм и указатели на функции

Полиморфизм и указатели на функции

Можно ли считать указатели на функции одним из способов реализации статического полиморфизма?

91
Очередь на языке С++

Очередь на языке С++

Пытаюсь решить следующую задачу: создать пользовательскую очередь, в которой каждый элемент равен сумме предыдущих, первый элемент равен...

82