Разница между 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
*/

6 ответов

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

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

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

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

  1. Изменить 7 в s[7] в 6
  2. Добавить нулевой терминатор в s[7]

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

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

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

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

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

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

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

ВЫХОД

  7              7

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

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

Когда у тебя есть:

char s[10] = "qwerty";

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

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

Если вы хотите добавить 'A' в конец вашей строки, это с индексом 6, так как индексы массива начинаются с 0

 s[6] = 'A';

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

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

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

Как объяснил Филип Поттер, основное отличие заключается в том, что memcpy скопирует все N символов, которые вы запрашиваете, а strncpy скопирует до первого нулевого терминатора включительно или до N символов, в зависимости от того, что меньше. В случае, если он копирует менее N символов, он дополняет остальные нулевыми символами. Выполните приведенный ниже код и проверьте разницу, она может оказаться полезной.

      #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char s[10] = "qwer\0ty", 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);
    for(int i = 0; i<8; i++)
    {
        printf("%d=%c,",i,str[i]);
    }
    printf("\n");
    for(int i = 0; i<8; i++)
    {
        printf("%d=%c,",i,str1[i]);
    }
    return 0;
}

Выход:

      qwer
qwer
qwer
0=q,1=w,2=e,3=r,4=,5=,6=,7=,
0=q,1=w,2=e,3=r,4=,5=t,6=y,7=A,
Другие вопросы по тегам