web-dev-qa-db-ja.com

strncpyとmemcpyの違いは?

ss[7]にアクセスするにはどうすればよいですか?

strncpymemcpyの間に違いは見られませんでした。出力ss[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
*/
18
user559208

他の人はあなたのヌル終了問題を指摘しました。 memcpystrncpyの違いを理解する前に、ヌル終了を理解する必要があります。

違いは、memcpyは要求されたN文字すべてをコピーするのに対し、strncpyは最初のヌルターミネータまたはN文字のいずれか少ない方までコピーすることです。 (コピーする文字数がN未満の場合、残りの文字はnull文字で埋められます。)

27
Philip Potter

インデックス7が正しくないため(配列は1ではなく0からインデックス付けされます)、出力quertyを取得しています。文字列の終わりを示す null-terminator がインデックス6にあり、その後に続くものは何も効果がありません。

修正する必要がある2つのこと:

  1. 7s[7]6に変更します
  2. s[7]にnullターミネータを追加します

結果は次のようになります。

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

元の動作なし および 固定動作

strncpymemcpy の質問については、strncpyがnullターミネータを追加するという違いがあります。 。ただし、ソース文字列の前にnが1つある場合のみ。したがって、ここではstrncpyを使用しますが、大きなものには十分注意してください。

8
marcog

Strncpyは、コピーするバイト数を指定した場合でも最大NULLをコピーしますが、memcpyは指定されたバイト数までコピーします。

printfステートメントはNULLまで印刷するため、1つの文字を印刷しようとすると、それが表示されます。

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

出力

  7              7
3
GOBI

「qwertyA」を作成するには、s[6] = 'A's[7]='\0'を設定する必要があります

文字列は0からインデックスが付けられるため、s[0] == 'q'であり、nullで終了する必要があります。

2
Matt Ellen

あなたが持っているとき:

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 

配列のインデックスは0から始まるため、文字列の末尾に「A」を追加する場合は、インデックス6にあります。

 s[6] = 'A';

この方法で配列を初期化すると、残りのスペースは0(nulターミネーター)に設定されます。この場合は不要ですが、通常、文字列をnulで終了する必要があることに注意してください。例えば.

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

上記の例では、nulターミネータを含む「qwerty」がsにコピーされます。 s [6]はそのnulターミネーターを上書きします。残りのsは初期化されていないため、s[7] = 0;を使用してnulターミネータを自分で追加する必要があります。

2
nos