#c #arrays
#c #массивы
Вопрос:
Нужна помощь с копированием объекта array во временный объект array с использованием цикла for (см. Код комментарии ниже)….. Заранее спасибо!!!!
int counter;
char buffer[] = "this is what i want 0 ignore the rest after the zero"; //
char command[sizeof(buffer)];
for ( counter = 0; counter < sizeof(buffer); counter ){
if ( buffer[counter] == '0' ){
break; // Exit loop (Should Exit)
}
command[counter] = buffer[counter]; // Copy array object into new array
printf("%c",command[counter]);
}
printf("n",NULL);
printf("%sn",command); // However when I print it contains the whole array this shouldnt be is should only contain "this is what i want "
Комментарии:
1. этот код является C — не c
2. Убедитесь, что оба нуля равны нулю, а не прописной букве «О». Кроме того, убедитесь, что вы завершаете команду[] buffer нулевым символом — ». Кроме того, подобное поведение возникло бы, если бы вы случайно сравнили ==0 или ==».
3. @Seth Если что-то допустимо, это не значит, что это следует использовать. Выше приведен пример того, как не должна выглядеть программа на c .
4. @VJo то, что, по вашему мнению, его не следует использовать, не означает, что это не C . Он отлично работает в моем компиляторе C , следовательно, это C . Просто так получилось, что это также допустимый C-код. Вы можете привести аналогичные аргументы против троичного оператора и макросов. Но они тоже на C .
5. @Seth То, что он компилируется на вашем компиляторе, ничего не доказывает. Почему против троичного оператора и макросов?
Ответ №1:
Строки заканчиваются ''
символом
Поэтому просто добавьте после цикла for
command[counter]=0;
(при выходе из цикла for значение counter
будет «указывать» на место последнего символа в command
переменной)
Ответ №2:
Ваш код работает нормально:
вывод:
это то, что я хочу
, это то, что я хочу
Редактировать: При этом вам необходимо инициализировать ваш выходной буфер:
char command[sizeof(buffer)]={}; // now the string will be null-termiated
// no matter where the copy ends
Комментарии:
1. вздох отстой, когда вы не можете быть уверены, что код неверен, когда люди говорят, что это неправильно.
2. При использовании Visual C он не печатается таким образом: (однако после завершения команды [counter] = 0 это работает
3. Вот почему я добавил свою правку. Если вы инициализируете свой буфер (как и следует в большинстве случаев), вам не понадобится завершение.
4. @Blindy: код неверен, как указано в вопросе. заполнение буфера нулем — эффективный, но расточительный способ скрыть ошибку в коде (и не то, что вы должны делать в большинстве случаев, или что-либо подобное этому).
Ответ №3:
Есть немного более простой способ выполнить эту работу:
sscanf(buffer, "%[^0]", command);
Это копирует правильные данные и гарантирует, что они будут должным образом завершены, и все это за одну (достаточно) простую операцию.
Обратите внимание, что в C вы, вероятно, захотите использовать std::string
вместо массивов char с нулевым завершением для ситуаций, подобных этой.
Комментарии:
1.
sizeof(buffer)
может быть определен во время компиляции и, следовательно, является вполне допустимым размером дляcommand
массива даже в C .2. @Karl: Упс, ты совершенно прав. Я приношу извинения за ошибку.
Ответ №4:
counter = 0;
while (buffer[counter] != '0'){
command[counter] = buffer[counter];
counter ;
}
попробуйте что-то подобное … но добавьте элемент управления, чтобы убедиться, что вы не исключаете размер буфера / команды!