2014-09-10 6 views
-2

Эй, ребята, я получаю ошибку вне диапазона для string.at (x), и я понятия не имею, почему. Любая помощь, в основном, я пытаюсь убедиться, что первый символ не является < 'A' или> 'z' в моей строке объекта. Также я думаю, что мое сравнение строк может работать некорректно, но это может иметь больше общего с незавершенным кодом, если я нахожу уникальное слово с дубликатами.Вне диапазона строка?

struct wordCount{ 
string word; 
int count; 
}storeword[100]; 

void countWordFreq(wordCount compares[]){ 
int a=0; 
unsigned i=0; 
for(a;a<101;a++){ 
    cout<<"Length"<<compares[a].word.length(); 
    if(compares[a].word.at(i)<='z'||compares[a].word.at(i)>='A'){  
    compares[a].count++; 
    } 
    for(int b=1;b<101;b++){ 
     cout<<"Length"<<compares[b].word.length(); 
     if(compares[b].word.at(i)<='z'||compares[b].word.at(i)>='A'){   
     if(compares[a].word.compare(compares[b].word)==0){ 
      cout<<"true" << endl; 
      compares[a].count++; 
     } 
    } 
     b++; 
    } 
    a++; 

} 
for(int q;/*compare[q].word.at(0)<='z'||compare[q].word.at(0)>='A'*/q<10;q++){ 
    cout<<"Word: " << compares[q].word << " Count: " << compares[q].count << endl; 
} 

}

+1

Я предполагаю, что размер массива 'comparees' равен' 100'. Если это так, счетчики индексов массива 'a' и' b' должны быть меньше, чем '100', не меньше, чем' 101'. Когда значение 'a' или' b' равно '100', вы получите неопределенное поведение из-за доступа к памяти за пределами диапазона. –

ответ

0

Ничего себе. Риск озвучивания (будучи? - если так, извините) невежливым, я думаю, что я бы сделал эту работу совсем по-другому.

Стандартная библиотека C++ предоставляет довольно много инструментов для выполнения этой задачи гораздо легче, с гораздо меньшим шансом найти труднодоступные ошибки и т. Д. Я бы их использовал.

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

#include <string> 
#include <map> 
#include <iostream> 
#include <iomanip> 
#include <cctype> 
#include <sstream> 

void countWordFreq(std::string const &input) { 
    std::map<std::string, size_t> counts; 

    std::istringstream buffer(input); 

    std::string word; 

    // read the words, count frequencies of those that start with letters 
    while (buffer >> word) 
     if (isalpha(word[0])) 
      ++counts[word]; 

    // write out each word we found and how often it occurred: 
    for (auto const &count : counts) 
     std::cout << std::setw(20) << count.first << ": " << count.second << "\n"; 
} 

В настоящее время это печатает уникальные слова в алфавитном порядке. Если вам не нужен этот заказ, вы можете (обычно) увеличить скорость, используя std::unordered_map вместо std::map.

+0

Спасибо, извините, я все еще новичок в программировании и не очень хорошо знаком со всеми библиотеками и тем, что они предлагают, а также правильно их использует. Я не могу запустить его, так как карта не объявлена. – user3051442

+0

@ user3051442: вам нужно включить '', чтобы получить объявление. Вам понадобятся и другие заголовки. Я их отредактирую. –

Смежные вопросы