0

我想创建一个与“chaine”大小相同但仅在函数之后的新数组

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

当我调用“函数”时,“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数组是特殊的,因为它们具有在声明它们时指定的size和取决于它们的内容的length 。数组的大小是分配给它的内存量。'\0'字符串的长度是终止 null ( )之前的字符数。

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)在函数内部总是会返回指针到字符的大小,而不是原始数组的大小。如果您想知道字符串有多长,请确保它以 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 回答