我想创建一个具有相同大小“chaine”的新数组,但只能在函数
之后 char chaine[Lenght]; //Lenght = 20
function(chaine, sizeof(chaine));
当我打电话给“功能”时,“chaine”的大小会随机变化。
新数组“chaine2”也需要填充“*”字符。
让我们试着用一些printf来解释:
printf("chaine = %s\n", chaine);
将在屏幕上显示如下内容:chaine = WORDS(5个字符)
我想要“chaine2”这样显示:chaine2 = *****(5星)
我为我的英语道歉,谢谢你的阅读
答案 0 :(得分: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);
}
答案 1 :(得分:1)
请记住,char
数组是特殊的,因为它们具有 size ,您在声明它们时指定它们,以及 length ,取决于他们的内容。数组的大小是分配给它的内存量。字符串的长度是终止空值('\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的指针的大小,而不是原始数组的大小。如果你想知道字符串有多长,请确保它以空值终止并使用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'
}
答案 2 :(得分:1)
我将假设您正在使用C99(因此可以使用可变长度数组)。
如果你想在function()
之外创建数组(其中chaine
仍然是一个数组),你可以这样做:
char chaine2[Lenght];
或者,可能更好:
char chaine2[sizeof(chaine)];
如果你在function()
里面,请注意chaine
将是一个指针,因为编译器在函数参数中看到一个数组定义作为指向它的第一个元素的指针(如果这是令人困惑的, remember that pointers are not arrays)
所以,即使函数定义如下:
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));