Visual C копирует массив символов в массив символов

#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:

http://ideone.com/haCBP

Ваш код работает нормально:

вывод:
это то, что я хочу
, это то, что я хочу

Редактировать: При этом вам необходимо инициализировать ваш выходной буфер:

 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   ;
}
  

попробуйте что-то подобное … но добавьте элемент управления, чтобы убедиться, что вы не исключаете размер буфера / команды!