Разница между strncpy и memcpy?

Как я могу получить доступ к s[7] в s?

Я не наблюдал никакой разницы между strncpy и memcpy. Если я хочу напечатать вывод s, а также s[7] (например, qwertyA), какие изменения я должен внести в следующем коде:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char s[10] = "qwerty", str[10], str1[10];
    s[7] = 'A';
    printf("%s\n",s);
    strncpy(str,s,8);
    printf("%s\n",str);
    memcpy(str1,s,8);
    printf("%s\n",str1);
    return 0;
}
/*
O/P
qwerty
qwerty
qwerty
*/

Ответ 1

Другие указали на ваши проблемы с нулевым завершением. Вы должны понимать нулевое завершение, прежде чем понимать разницу между memcpy и strncpy.

Разница в том, что memcpy скопирует все N символов, которые вы запрашиваете, а strncpy будет копировать до первого нулевого терминатора включительно или N символов, в зависимости от того, что меньше. (Если он копирует меньше, чем N символов, он заполняет остальные символы нулями.)

Ответ 2

Вы получаете вывод querty, потому что индекс 7 неверен (массивы индексируются от 0, а не 1). Существует null-terminator в индексе 6, чтобы сигнализировать конец строки, и все, что приходит после него, не будет иметь эффекта.

Две вещи, которые вам нужно исправить:

  • Измените 7 в s[7] на 6
  • Добавьте нулевой ограничитель в s[7]

Результат будет:

char s[10] = "qwerty";
s[6] = 'A';
s[7] = 0;

Оригинал не работает и исправлена ​​работа.

Что касается вопроса strncpy в сравнении с memcpy, разница в том, что strncpy добавляет нулевой ограничитель для вас. НО, только если исходная строка имеет значение до n. Итак, strncpy - это то, что вы хотите использовать здесь, но будьте очень осторожны с большим НО.

Ответ 3

Чтобы сделать "qwertyA", вам нужно установить s[6] = 'A' и s[7]='\0'

Строки индексируются от 0, поэтому s[0] == 'q', и они должны быть завершены нулем.

Ответ 4

Если у вас есть:

char s[10] = "qwerty";

это то, что содержит этот массив:

s[0]  'q'
s[1]  'w'
s[2]  'e'
s[3]  'r'
s[4]  't'
s[5]  'y'
s[6]   0
s[7]   0
s[8]   0
s[9]   0

Если вы хотите добавить "A" в конец строки, то в индексе 6, поскольку индексы массива начинаются с 0

 s[6] = 'A';

Обратите внимание, что когда вы инициализируете массив таким образом, оставшееся пространство устанавливается равным 0 (nul terminator). Хотя в этом случае это не нужно, обычно имейте в виду, что вам нужно сделать ваши строки nul завершенными. например.

char s[10];
strcpy(s,"qwerty");
s[6] = 'A';
s[7] = 0;

В приведенном выше примере "qwerty", включая его nul-терминатор, копируется в s. s [6] перезаписывает этот nul-терминатор. Так как остальная часть s не инициализируется, нам нужно добавить nul-терминатор с помощью s[7] = 0;

Ответ 5

Strncpy скопирует до NULL, даже если вы указали количество копируемых байтов, но memcpy будет копировать до указанного количества байтов.

Оператор

printf будет печатать до NULL, поэтому вы попытаетесь напечатать один символ, который будет отображаться,

printf("\t%c %c %c\t",s[7],str[7],str1[7]);

OUTPUT

  7              7