C Присваивает значение сразу двум строкам

#c #string #variable-assignment

#c #строка #переменная-назначение

Вопрос:

     unsigned short n = 0;
    while (!in.eof())
    {
        in >> opString;     //Read in string from file
        //Read the string from file character by character
        for (int i = 0; i < opString.size(); i  )
        {
            if (!op1b)  //If we do not yet know our first operand (op1b = false, b stands for bool, clever naming eh?)
            {       //Check if our next item is an operator. If it is...
                if (!(opString[i] == ' ' || opString[i] == '-' || opString[i] == '*' || opString[i] == '/' || opString[i] == '$'))
                    op1[i] = opString[i];
                else        //We finally know it since when we hit an symbol, our first number is known; do not repeat this if block
                    op1b = true;                
                n  ;
            }

            if (op1b amp;amp; !operb)     //If we know our first operand but not our operator...
            {
                oper = opString[i];     //Find out what our operator is.  Now we know it (operb = true)
                operb = true;
                i  ;                //We increment i because if we did not we'd double dip on the if statement below and wind up
            }                           // with an operator tacked onto the beginning of the second operand

            if (op1b amp;amp; operb)      //If we know our first operand and the operation, let's find operand #2
            {
                if (opString[i] == '=')
                    break;
                else
                {
                    op2[i-n] = opString[i];
                    j  ;
                }
            }
        }
        cout << "Op 1: " << op1.c_str() << endl << "Oper: " << oper.c_str() << endl << "Op 2: " << op2.c_str() << endl;
    }
    return 0;
}
  

Здесь у меня есть (начало) программа, предназначенная для чтения строк из текстового файла для сложения шестнадцатеричных операндов вместе. Строки имеют вид «op1OperatorOp2=» (без кавычек). Я только начинаю. Я пытаюсь удалить op1, op2 и оператор (все строки) из этого, читая строку из файла (opString) посимвольно (как указано i в цикле for). Цикл while просто проверяет, что это не конец файла для переменной fstream. op1b и operb — это значения bool, которые помогают определить, когда мы «знаем», каковы наши первый операнд и оператор (а затем, когда мы можем вычислить оператор номер 2).

Однако, когда я извлекаю op2 из строки, мой op1 заменяется значением op2, даже когда я говорю только op2 [whatever] = opString [i], где i давно прошло, где op1 вообще был бы.

Пример: если строка, приходящая из файла, равна «3 2 =», op1 должен получить 3, oper должен получить , а op2 должен получить 2. Однако op2 всегда заканчивается тем же, что и op1 в конце цикла. Таким образом, вместо op1 = 3, oper = , op2 = 2 я получаю op1 = 2, oper = , op2 = 2.

Есть ли какая-то недокументированная функция C , которую я упускаю? Я не могу понять, почему это происходит. Это потому, что я нахожусь в цикле? Должен ли я прервать свой цикл? Однако я не понимаю, почему это должно иметь значение. Спасибо.

Комментарии:

1. ‘но я подумал, что скопировать / вставить все это было проще, чем просто вставить цикл while, а затем обсудить детали.’ — вам легче писать, но нам сложнее читать, понимать и помогать вам.

2. Скорректировано. Спасибо за совет! Я новичок.

Ответ №1:

В следующий раз опубликуйте полный код (со всеми обозначениями). op1 и op2 являются std::string? Вы пытаетесь записать символы в op1 и op2 , но вы не выделили никакого пространства, т. Е. вы должны либо op1.resize(SOME_SIZE) перед циклом, либо использовать std::string::push_back для добавления символов к операндам.

Комментарии:

1. А, парень выше сказал мне, что публикация всего моего кода была плохой. Вот полная информация: pastebin.com/Q2fHV2pw И я попробую это, спасибо.

2. Спасибо, бегемот, это сработало! Я просто не уверен, почему это работает над простым присвоением. Но спасибо вам. Я ценю это!

3. @Stefan, если Begemoth ответил на твой вопрос, то ты можешь пометить это как true. Потому что ваш вопрос достаточно велик, чтобы потратить некоторое время, и он будет бесполезен, если на него уже дан ответ. Спасибо. 🙂