#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. Потому что ваш вопрос достаточно велик, чтобы потратить некоторое время, и он будет бесполезен, если на него уже дан ответ. Спасибо. 🙂