-2

ということで、基本的にstrcpyは第2引数のアドレスを第1引数に代入するのですが、配列を第1引数にするとどうなるのでしょう?私のプログラムのように、配列のアドレスを変更しようとしましたが、残念ながらコンパイルできません。そのため、capitalize の戻り値を割り当てるために、文字ポインター変数を作成する必要がありました。私が誤解していることはありますか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char string[20];
char *Capitalize(char *str)
{
    int i;
    char *temp;
    temp = malloc(sizeof(char)*(int)(strlen(str)+1));
    for(i = 0;i < strlen(str);i++)
    {
        if(*(str+i) >= 'a' && *(str+i)<= 'z')
            *(temp+i) = *(str+i) - 32;
        else
            *(temp+i) = *(str+i);
    }
    *(temp+i) = '\0';
    return temp;
}
int main(void)
{
    string word;
    printf("Enter word to capitalize: ");
    scanf("%19s",word);
    word = Capitalize(word);
    printf("%s",word);
    return 0;
}
4

3 に答える 3

1

strcpy()名前が示すように、コピーを作成します。文字列を配列にコピーすることは完全に合法です。

次のような配列の初期化を行う場合:

char myarr[] = "hello";

実際に文字を配列にコピーしています。

配列とポインターを混同しているようです (何らかの理由で配列を同じように扱うことができないため、こちらを参照してください)

于 2012-10-02T17:16:51.623 に答える
0

あなたが見逃しているように見えるのは、c / c ++文字列では配列であり、ほとんどの実用的な点で宣言しているということです

char c[] = "hello";

char* c = "hello";

同じことですが、strcpyが行うのは、メモリが配列(おそらくスタック上)またはポインタ(おそらくヒープ上)として割り当てられているかどうかに関係なく、宛先メモリに文字をコピーすることだけです。違いはありません。

于 2012-10-02T17:24:13.910 に答える
0

C では、インデクサーを使用せずに配列を名前で修飾することは、配列の最初の要素のメモリ アドレスへのポインターを指定することと同じです。そのため、配列をパラメーターとして などの関数に渡すことができますstrcpy

char * strcpy ( char * destination, const char * source );

strcpysourceは、 で指定されたメモリ アドレスから で指定されたメモリ アドレスに、ヌル文字 (0) が見つかるまで、見つかった文字列をすべてコピーしますdestination(このヌル文字もコピー先バッファにコピーされます)。

パラメータで指定されたアドレス値は変更されず、メモリ内のコピー元とコピー先を指定するだけです。destinationコピーされた文字列が収まるのに十分な容量を持つメモリ バッファ (char 配列または malloc を介して要求されたメモリ ブロック) を指していることが重要です。そうしないと、バッファ アンダーランが発生します (バッファー) を使用すると、プログラムがクラッシュしたり、奇妙な動作をしたりする可能性があります。

私が明確であり、私の説明であなたをこれ以上混乱させないことを願っています;)

于 2012-10-02T17:47:02.643 に答える