22

How can I access s[7] in s?

I didn't observe any difference between strncpy and memcpy. If I want to print the output s, along with s[7] (like qwertyA), what are the changes I have to made in the following code:

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

Output:

qwerty
qwerty
qwerty
4

6 回答 6

40

其他人指出了您的空终止问题。memcpy在了解和之间的区别之前,您需要了解空终止strncpy

主要区别在于,memcpy它将复制您要求的所有 N 个字符,而strncpy将复制最多包含第一个空终止符或 N 个字符,以较少者为准

如果它复制的字符少于 N 个,它将用空字符填充其余部分。

于 2011-01-04T13:16:32.697 回答
8

您得到输出querty是因为索引7不正确(数组从 0 开始索引,而不是 1)。索引处有一个空终止符6来表示字符串的结尾,它后面的任何内容都将无效。

您需要解决两件事:

  1. 更改为7_s[7]6
  2. s[7]

结果将是:

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

原来不工作固定工作

至于strncpyvs的问题memcpy,不同之处在于strncpy为您添加了一个空终止符。但是,只有源字符串之前有一个nstrncpy您想在这里使用的也是如此,但要非常小心大 BUT。

于 2011-01-04T13:10:36.990 回答
4

即使您指定了要复制的字节数, strncpy 也会复制NULL,但 memcpy 会复制到指定的字节数。

printf 语句将打印到 NULL,因此您将尝试打印单个字符,它会显示,

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

输出

  7              7
于 2012-10-12T11:37:31.100 回答
2

要制作“qwertyA”,您需要设置s[6] = 'A's[7]='\0'

字符串从 0 开始索引,因此s[0] == 'q',它们需要以空值结尾。

于 2011-01-04T13:10:45.170 回答
2

当你有:

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 终止符),虽然在这种情况下不需要,但通常请注意,您需要使您的字符串以 nul 终止。例如

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

在上面的例子中 "qwerty" ,包括它的 nul 终止符被复制到s. s[6] 覆盖那个 nul 终止符。由于其余部分s未初始化,我们需要自己添加一个 nul 终止符s[7] = 0;

于 2011-01-04T13:53:10.903 回答
0

正如 Philip Potter 所解释的,主要区别在于 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,
于 2021-12-10T07:08:11.513 回答