s
のs[7]
にアクセスするにはどうすればよいですか?
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
*/
他の人はあなたのヌル終了問題を指摘しました。 memcpy
とstrncpy
の違いを理解する前に、ヌル終了を理解する必要があります。
違いは、memcpy
は要求されたN文字すべてをコピーするのに対し、strncpy
は最初のヌルターミネータまたはN文字のいずれか少ない方までコピーすることです。 (コピーする文字数がN未満の場合、残りの文字はnull文字で埋められます。)
インデックス7
が正しくないため(配列は1ではなく0からインデックス付けされます)、出力querty
を取得しています。文字列の終わりを示す null-terminator がインデックス6
にあり、その後に続くものは何も効果がありません。
修正する必要がある2つのこと:
7
のs[7]
を6
に変更しますs[7]
にnullターミネータを追加します結果は次のようになります。
char s[10] = "qwerty";
s[6] = 'A';
s[7] = 0;
strncpy
と memcpy
の質問については、strncpy
がnullターミネータを追加するという違いがあります。 。ただし、ソース文字列の前にn
が1つある場合のみ。したがって、ここではstrncpy
を使用しますが、大きなものには十分注意してください。
Strncpyは、コピーするバイト数を指定した場合でも最大NULL
をコピーしますが、memcpyは指定されたバイト数までコピーします。
printfステートメントはNULLまで印刷するため、1つの文字を印刷しようとすると、それが表示されます。
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'
であり、nullで終了する必要があります。
あなたが持っているとき:
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ターミネータを自分で追加する必要があります。