Ошибка в программе. Некорректный вывод

281
03 мая 2017, 11:38

Помогите пожалуйста. Функция должна выводить слово(слова) минимальной длины. Я решил найти длину минимального слова, и если текущее слово в цикле имеет эту длину, то выводим его. Но при выводе в терминал выводится только одно слово

"Hello wo rl dddd" ---> "wo"

Код функции:

void findSmallestWord(char* text){
  int length = strlen(text);
  int minLength = minWordLength(text, length);
  char minWords[minLength];
  int index = 0;
  int symbols = 0;
  int j = 0;
  for(int i = 0; i < length; i++){
    if((text[i] >= 'A' && text[i] <= 'Z') || (text[i] >= 'a' && text[i] <= 'z')){
      symbols++;
    }
    else{
      if(symbols == minLength){
        index = i - symbols;
        while(j < symbols){
          minWords[j] = text[index];
          index++;
          j++;
        }
        minWords[j] = ' ';
        symbols = 0;
      }
      else{
        symbols = 0;
      }
    }
  }
  for(int i = 0; i < j; i++){
    cout << minWords[i];
  }  
  cout << endl;
}
Answer 1

Вот здесь char minWords[minLength]; так и просится char minWords[minLength+1]; - вы точно не забыли о завершающем нулевом символе? И это - если только для одного слова... Но все равно это некомпилируемая ерунда, потому что в C++ размер массива надо знать во время компиляции.

Проверка (text[i] >= 'A' && text[i] <= 'Z') || (text[i] >= 'a' && text[i] <= 'z') сводится к одному isalpha(text[i]).

Ваш главный прокол - в проверке while(j < symbols) - после первого слова j перестает быть меньше symbols. И на следующем найденном слове копирование не выполняется. Там вообще нужно подчистить эту логику, после пробела нужно увеличить j.

А вообще, раз это C++, я бы делал примерно так:

vector<string> minLengthWords(const char * text)
{
    vector<string> words;
    istringstream is(text);
    string word;
    size_t minlen = numeric_limits<size_t>::max();
    while(is >> word)
    {
        size_t l = word.length();
        if (l < minlen) minlen = l;
        words.push_back(word);
    }
    words.erase(remove_if(words.begin(),words.end(),
                          [minlen](const string&w){ return w.length() > minlen; }),
                words.end());
    return words;
}
int main()
{
    const char * text = "vvjhvx xjhvxz agsvghvds hdbhj gsvg csfc casgfcgfas vsac";
     for(auto s: minLengthWords(text)) cout << s << endl;
}

Вот немного исправленный ваш код.

void findSmallestWord(const char* text)
{
  int length = strlen(text);
  int minLength = minWordLength(text, length);
  char * minWords = new char[length+1]; // Если для C - то char * minWords = malloc(length+1);
  int index = 0;
  int symbols = 0;
  int j = 0, lastpos = 0;
  for(int i = 0; i < length; i++)
  {
      if(isalpha(text[i]))
      {
          symbols++;
      }
      else
      {
          if(symbols == minLength){
              index = i - symbols;
              while(j < symbols)
              {
                  minWords[lastpos + j++] = text[index++];
              }
              minWords[lastpos + j++] = ' ';
              lastpos += j;
              j = 0;
          }
          symbols = 0;
      }
  }
  minWords[lastpos] = 0;
  cout << minWords << endl; // В С используйте puts(minWords);
  delete[] minWords;        // В С используйте free(minWords);
}

Но учтите, он не сработает, если последнее слово в строке - минимальной длины. Но этот случай уж разберите самостоятельно, OK?

READ ALSO
Объединение двумерных строк с помощью strcat в цикле

Объединение двумерных строк с помощью strcat в цикле

Почему strcat в цикле добавляет содержимое второго массива (аргумента) в первый несколько раз, как показано на картинке

274
Анализ загруженности кода

Анализ загруженности кода

Есть ли какие-нибудь инструменты для C++ на Windows, которые позволяют узнать, сколько раз программа выполнила какую-то строчку?

243
Масштабирование элементов QGraphicsItem

Масштабирование элементов QGraphicsItem

Пытаюсь создать графический редактор на QtДобавил на сцену графические элементы QGraphicsItem на сцену QGraphicsScene

521
запись в excel c++

запись в excel c++

Как можно записать данные в файл Excel, сначала создав этот файл? Также можно ли это сделать с помощью функции ofstream?

256