0

同じサイズの「chaine」で、関数の後にのみ新しい配列を作成したい

 char chaine[Lenght];   //Lenght = 20
 function(chaine, sizeof(chaine));

「関数」と呼んだとき、「チェーン」のサイズはランダムに変化しています。

新しい配列「chaine2」も「*」文字でいっぱいである必要があります。

いくつかのprintfで説明してみましょう:

     printf("chaine = %s\n", chaine);

画面に次のように表示されます:chaine = WORDS(5文字)

そして、「chaine2」を次のように表示したい:chaine2 = *****(5つ星)

英語をお詫びします、読んでくれてありがとう

4

3 に答える 3

2
#include <stdio.h>
#include <stdlib.h>

char *dup_and_fillStar(const char *src, const size_t size){
    char *p,*ret;
    ret=p=(char*)malloc(sizeof(char)*size);
    while(*src++)
        *p++='*';
    *p = '\0';
    return ret;
}

#define Length  20

int main(void){
    char chaine[Length] = "WORDS"; 
    char *chaine2;

    chaine2 = dup_and_fillStar(chaine, sizeof(chaine));
    printf("chine = %s\n", chaine);
    printf("chine2 = %s\n", chaine2);
    free(chaine2);

    return(0);
}
于 2012-04-26T09:15:57.360 に答える
1

char配列は、宣言時に指定するサイズと、その内容に応じた長さを持つという意味で、特別なものであることを忘れないでください。配列のサイズは、配列に割り当てられているメモリの量です。文字列の長さは、終了するnull()の前の文字数'\0'です。

some_func() {
  int len = 20;      // Size of the array
  char chaine[len];  // Uninitialized array of size 20.

  memset(chaine, '\0', sizeof(chaine)); // Init to all null chars, len = 0
  strcpy(chaine, "WORDS"); // Copy a string, len = 5

  char *chaine2 = function(chaine, sizeof(chaine));
  printf("%s\n", chaine2);
  free (chaine2);
}

配列を関数に渡すと、それはポインターのように扱われます。したがって、関数内では、元の配列のサイズではなくsizeof(str)、常にcharへのポインタのサイズが返されます。文字列の長さを知りたい場合は、文字列がnullで終了していることを確認し、次のように使用します。strlen()

char *function(char *str, int len) {
  // Assume str = "WORDS", len = 20.
  char *new_str = malloc(len); // Create a new string, size = 20

  memset(new_str, '\0', len);  // Initialize to nulls
  memset(new_str, '*', strlen(str)); // Copy 5 '*' chars, len = 5

  return new_str;  // Pointer to 20 bytes of memory: 5 '*' and 15 '\0'
}
于 2012-04-26T02:34:08.443 に答える
1

C99を使用していると仮定します(したがって、可変長配列を使用できます)。

function()(まだ配列がある)外部に配列を作成したい場合chaineは、次のようにするだけです。

char chaine2[Lenght];  

または、おそらくより良い:

char chaine2[sizeof(chaine)];

内部にいる場合は、それがポインタになることfunction()に注意してください。chaineコンパイラは、関数パラメータの配列定義を最初の要素へのポインタと見なすためです(これが混乱する場合は、ポインタは配列ではないことに注意してください) 。

したがって、関数が次のように定義されている場合でも、次のようになります。

function(char chaine[], size_t length) {

コンパイラはそれを次のように認識します。

function(char *chaine, size_t length) {

chaine2いずれにせよ、次のように言って作成できます。

    char chaine2[length];

だがしかし

    char chaine2[sizeof(chaine)]; // DONT DO THIS

sizeof、配列のサイズではなく、ポインタのサイズを返すためです。

ただし、作成する場合でも、新しい配列に「*」文字を入力する場合は、次を使用できますmemset()

 memset(chaine2,'*',sizeof(chaine2));
于 2012-04-26T02:38:34.060 に答える