以下函数允许我计算字符串的长度:
int arrayLen (char array[])
{
int i = 0;
while ( array[i] )
++i;
return i;
}
问题是,如果一个数组有20个元素,但只使用其中的5个(包括空字符\0
),那么该函数将返回5.因此,很难知道如何字符串可以在函数中支持的许多字符。遗憾的是,由于数组是动态分配的,因此无法使用sizeof
。
以下是我尝试创建的基本功能的示例,它允许用户将字符串插入到source[]
索引处的另一个字符串中:
void insertString (char source[], char insert[], int index)
{
int n = arrayLen (insert);
char temp[n];
// Replace characters from index with characters in insert array
for ( i = 0; source[index + i] && insert[i]; ++i )
{
temp[i] = source[index + i];
source[index + i] = insert[i];
}
// Concatenate replaced characters onto source array
for ( i = 0; temp[i]; ++i )
source[index + n + i] = temp[i];
}
上述代码正常工作,直到source[]
不足以包含自身和元素insert[]
。有没有测试这个并通知用户?
我理解查找数组长度的局限性但有没有办法检查数组是否已正确连接到source[]
上?
e.g。
input = the wrong son
output = the wrong person▒▒"
答案 0 :(得分:1)
在C中,您需要明确告诉编译器缓冲区大小作为参数,因为数组中的所有元素都不会复制到数组参数中;相反,它们由指针引用。 - T.C.
sizeof array / sizeof array[0]
不起作用,因为sizeof array
引用了指向array
中第一个元素的指针的大小,而不是数组中所有元素的大小。只有在sizeof
计算的同一函数中声明数组时,这才有效。
但是,您可以计算数组中占用的元素数量,如下所示:
int i = 0;
while ( array[i] )
++i;
如果数组以空字符\0
结束,则此方法有效。如果数组比实际使用的数据保留的空间更多,则上述函数将无法识别该数据。
答案 1 :(得分:0)
如果您没有将实际缓冲区大小传递给函数,则无法确定其大小。将数组传递给函数时,它会衰减到指针:
unsigned wrong_sizeof(char arr[])
{
return (unsigned)sizeof arr;
}
int main(void)
{
char s[] = "Hello world!";
char *p;
printf("wrong_sizeof(s): %u\n", wrong_sizeof(s));
printf("sizeof p: %u\n", (unsigned) sizeof p);
printf("sizeof s: %u\n", (unsigned)sizeof s);
return 0;
}
该程序首先打印不正确的大小计算,这是不正确的,因为函数wrong_sizeof
接收到指向数组的第一个元素(&s[0]
)而不是整个数组本身的指针。这是C语言规范所要求的。
接下来是直接使用sizeof
运算符的指针大小,后跟直接使用sizeof
运算符而不是函数的数组大小。这证明函数接收指针。
总而言之,你必须通过两件事之一:
使用其中任何一个,如果传递了错误的参数,那么作为函数的设计者就不再是你的错了,因为你只是做了你所说的话,类似于strncpy
,{{1等等。
修改强>
解决更新问题:
strcat
新字符串所需的大小(包括空终止符)是源字符串中的字符数,不包括空终止符,加上存储要插入的字符串所需的字符数,包括空终止符。例如:
new_size == source_length - i + insert_size
将导致需要14 - 7 + 5或12个字符的新字符串:7表示“Hello”,5表示“John \ 0”。