Запутанные массивы символов и указатели в C ++ - PullRequest
1 голос
/ 14 марта 2011

Привет всем, спасибо, что нашли время для решения моей проблемы.Я посмотрел на столько материала в этот момент, что я начал все больше и больше путаться.По сути, я пишу простой сегмент кода, который анализирует строку.Пожалуйста, поймите, что мой вопрос не о разборе.Я использую C ++ и никогда раньше не использовал C и обладаю небольшим опытом работы с C ++ (вводный опыт, я все еще новичок).

struct parsedString{
char chunk1[50];
char chunk2[10];
char chunk3[50];
};

main(char* bigstring)
{
    parsedString ps;
    ps = parseMe(bigString)
    cout << ps.chunk1 << endl;
    cout << ps.chunk2 << endl;
    cout << ps.chunk3 << endl;
}

parsedString parseMe(char* stringToParse)
{ 
    char* parseStr = stringToParse; 
    parsedString ps; 
    ps.chunk1 = first x chars; 
    ps.chunk2 = next y chars;
    ps.chunk3 = last z chars; 
    return ps;
}

Очевидно, что это не работаеткод, я не хотел бросать все лишние вещи, потому что было бы сложнее читать, и я почти уверен, что моя проблема - проблема новичка c / c ++ и что-то о распределении памяти или что-то в этом роде ...

По сути, когда основная функция получает печать строк из parsedString, она выводит именно то, что мне нужно, плюс символы мусора.Я ввожу значения для каждого массива ps.chunk, используя

ps.chunk1 [i] = * parseStr

, так как parseStr получает каждый отдельный символ,Я не могу понять, откуда появляются мусорные символы, это как-то связано с тем, как я получаю доступ к большой строке?Первоначально я использовал char в структуре вместо массивов, и когда я печатал из функции parseMe (), они получались великолепными, но они превращались в тарабарщину, когда я обращался к ней из основной функции.Спасибо за любую помощь, большое спасибо.

Если что-то неясно, пожалуйста, дайте мне знать, что я сделаю все возможное, чтобы уточнить.

Ответы [ 3 ]

6 голосов
/ 14 марта 2011

Непонятно, почему вы пытаетесь сделать это с '\0' прекращено строки, когда в C ++ есть класс строки, который можно использовать, но Предположим, некоторые педагогические причины: ваши строки '\0' прекращено? Как вы извлекаете и копируете первые символы в ps.chunk1? Как вы гарантируете, что он имеет '\0'?

Если вы действительно хотите получить ровно n символов, вам необходимо:

assert(strlen(parseStr) >= n);

, скопируйте их в цель (которая должна содержать не менее n + 1 символов),

memcpy(ps.chunk1, parseStr, n);

, и добавить окончательный '\0':

ps.chunk1[n] = '\0';

(и, конечно, заранее parseStr: parseStr += n;)

Или вы можете просто использовать std :: string везде и писать что-то вроде:

ps.chunk1(stringToParse.substr(startPosition, length));
1 голос
/ 14 марта 2011

Это может произойти по нескольким причинам.

  • Когда вы объявляете parsedString ps;, было бы хорошо инициализировать структуру и убедиться, что вы получаете чистые блоки памяти для работы. parsedString ps = {0}; Некоторые платформы не делают этого, и вы сами должны обнулите память перед использованием.

  • char* строки должны заканчиваться символом \0. Этот символ сигнализирует об окончании символа *. Это обязательно! Если вы не вставите его в конец строки, то, скорее всего, операция печати (например) отобразит содержимое за пределами массива, содержащего символы мусора. Это автоматически достигается путем обнуления всей структуры, как я предлагаю выше.

1 голос
/ 14 марта 2011

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

struct parsedString{
    std::string chunk1;
    std::string chunk2;
    std::string chunk3;
};

parsedString parseMe(const std::stirng & stringToParse) {
    parsedString result;

    // just an example - this assigns the first two characters of stringToParse 
    // to chunk1
    result.chunk1 = stringToParse.substr(0, 2); 
    // get the other chunks

    return result; // return the result
}

Приведенный выше код должен иллюстрировать использование. Вы можете найти больше информации о std::string здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...