22

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

strncpyと の間に違いは見られませんでしたmemcpy。output を(like )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
4

6 に答える 6

40

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

主な違いは、memcpy要求した N 文字すべてstrncpyをコピーするのに対し、 は最初のヌル ターミネータまで、または N 文字のいずれか少ない方までコピーすることです。

コピーする文字数が N 文字未満の場合、残りはヌル文字で埋められます。

于 2011-01-04T13:16:32.697 に答える
8

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

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

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

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

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

オリジナルが機能せず、機能が修正されました。

strncpyvsの問題に関してはmemcpy、違いはstrncpynull ターミネータを追加することです。ただし、ソース文字列の前にn. ここstrncpyで使用したいものもありますが、大きな 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

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

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」を追加する場合、配列インデックスは 0 から始まるため、インデックス 6 になります。

 s[6] = 'A';

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

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

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

于 2011-01-04T13:53:10.903 に答える
2

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

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

于 2011-01-04T13:10:45.170 に答える