簡體   English   中英

strncpy 和 memcpy 的區別?

[英]Difference between strncpy and memcpy?

我怎樣才能獲得s[7]s

我沒有觀察到strncpymemcpy之間的任何區別。 如果我想打印輸出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

其他人已經指出了您的空終止問題。 在了解memcpystrncpy之間的區別之前,您需要了解空終止。

主要區別在於memcpy將復制您要求的所有 N 個字符,而strncpy將復制到第一個空終止符或 N 個字符,以較少者為准

如果它復制的字符少於 N 個,它將用空字符填充其余字符。

您正在獲取輸出querty因為索引7不正確(數組從 0 開始索引,而不是從 1 開始)。 在索引6處有一個空終止符來表示字符串的結束,它后面的任何內容都無效。

你需要解決的兩件事:

  1. 改變7s[7]6
  2. s[7]添加一個空終止符

結果將是:

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

原來不工作固定工作

至於strncpymemcpy的問題,不同之處在於strncpy為您添加了一個空終止符。 但是,僅當源字符串在n之前有一個時。 所以strncpy就是你想在這里使用的,但要非常小心大 BUT。

即使您指定了要復制的字節數,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM