C ++ Сохранение списка адресов в массиве для анализа необработанного не завершенного текста? - PullRequest
0 голосов
/ 05 сентября 2011

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

Примечание: я сократил текст на стене, вот проблема в двух словах

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

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

Я хотел сделать что-то более продвинутое, но меня попросили обрезать стену текста, чтобы сейчас все получилось:)

//pointers and other values like file opening were declared
int len = (int) strlen( words2 );

cout << "\nSize of Words2 is  : " << len << " bytes\n";

// Loops through array if uppercase then...     
for (int i = 0; i < len; i++)
    {

        if (isupper(words2[i]))
        {

        // Output the contents of words2

    cout << "\n Words2 is upper : " << words2[i] << "\n";
        b1 = &words2[i];

    //output the address of b1 and the intvalue of words2[var]

    cout << "\nChar address is  " << &b1 << " word address is " << (int) words2[i] << "\n";
        cout << "\nChar string is  " << b1 << " address +1 "<< &b1+1 <<"\n  and string is " << b1+1 << "\n";

        }
        cout << "\nItem I is : i " << i << " and words2 is  " << words2[i] << "\n";

    }


    fin.clear();
    fin.close();
    fout.close();

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Легко. Используйте Boost.Tokenizer , с char_separator("", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"). "" - это набор пропущенных разделителей, а A-Z - это набор сохраняемых разделителей. (Если бы вы использовали A-Z в качестве пропущенных разделителей, вы бы получили ord ord ord, потому что вы отбросили бы W).

0 голосов
/ 05 сентября 2011
vector<char *> parsedStrings;
char * words = "HelloHelloHello";
int stringStartAddress = 0;

for (int i = 0; i <= strlen(words); i++)
{
    /* Parses word if current char is uppercase or
     if it's the last char and an uppercase char was previously matched */
    if (isupper(words[i]) || ((i == strlen(words)) && (stringStartAddress != 0)))
    {
        // Current char is first uppercase char matched, so don't parse word
        if (stringStartAddress == 0)
        {
            stringStartAddress = ((int)(words + i));
            continue;
        }
        int newStringLength = ((int)(words + i)) - stringStartAddress;
        char * newString = new char[newStringLength + 1];
        // Copy each char from previous uppercase char up to current char 
        for (int j = 0; j < newStringLength; j++)
        {
            // Cast integer address of char to a char pointer and then get the char by dereferencing the pointer
            // Increment address to that of the next char
            newString[j] = *((char *)stringStartAddress++);
        }
        newString[newStringLength] = '\0'; // add null-terminator to string
        parsedStrings.push_back(newString);
    }
}
0 голосов
/ 05 сентября 2011

Так как вы также

хотел сделать что-то более продвинутое

Я бы посмотрел Boost.Regex с самого начала. Это хорошая библиотека для выполнения текстовых манипуляций.

...