[英]Difference between strncpy and 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;
}
輸出:
qwerty
qwerty
qwerty
其他人已經指出了您的空終止問題。 在了解memcpy
和strncpy
之間的區別之前,您需要了解空終止。
主要區別在於memcpy
將復制您要求的所有 N 個字符,而strncpy
將復制到第一個空終止符或 N 個字符,以較少者為准。
如果它復制的字符少於 N 個,它將用空字符填充其余字符。
即使您指定了要復制的字節數,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' 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;
正如 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,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.