有什么方法可以使用 C 中带有指针的 sizeof 函数来获取字符串的正确大小
Is there any way to get the correct size of a string using sizeof function with pointers in C
int main() {
char *s = "hello world!";
printf("%d\n",sizeof(s));
}
我知道它会 return 指针的大小。但我想知道有没有什么方法可以使用带指针的 sizeof 函数来获取字符串的长度。
我不希望你将 (char s[] ) s 用作数组,将其用作指针
请尽可能尽快回复。我也不想使用 strlen()
.
指针不保留指向单个对象或数组第一个元素的信息。
考虑以下示例
char *p;
char c = 'A';
p = "Hello";
p = &c;
正如所见,同一个指针可以指向具有类型 char[6]
的字符串文字 "Hello"(它的第一个字符)和单个字符 c.
通常,当将字符数组传递给函数时,它会隐式转换为指向其第一个元素的指针。但是,如果您将传递一个指向整个数组的指针,那么您可以使用 sizeof 运算符来确定它的大小。
例如
#include <stdio.h>
void f( char (*p)[6] )
{
printf( "%zu\n", sizeof( *p ) );
}
int main( void )
{
f( &"Hello" );
}
但这种方法有一个缺点,即在函数参数的声明中,您必须通过引用预先指定接受数组的大小。
因此,如果需要知道函数内数组的大小,一般方法是声明带有附加参数的函数,该参数指定传递的数组的大小。
考虑到一个字符串可以包含在一个字符数组中,该数组的大小远大于存储该字符串所需的大小。因此,要确定字符串本身的大小,您应该使用标准字符串函数 strlen
.
只有一种方法:
#include <stdio.h>
int main()
{
char s[] = "hello world!";
printf("%s -> %zu\n", s, sizeof s - 1);
}
你需要将s
声明为数组,而不是指针,sizeof
运算符,应用于指针,给你大小一个指针变量,它不是数组的大小(也不是你想要的)。
如您所见,我在声明中初始化数组,所以我不需要将大小放在括号之间(这不适用于赋值语句,它必须是带有初始化程序的声明)然后我减去一个到数组的大小,因为 sizeof
运算符给我数组的大小(不是字符串长度),这包括末尾 [=15=]
字符的 space。
当你运行它时:
$ a.out
hello world! -> 12
$ _
int main() {
char *s = "hello world!";
printf("%d\n",sizeof(s));
}
我知道它会 return 指针的大小。但我想知道有没有什么方法可以使用带指针的 sizeof 函数来获取字符串的长度。
我不希望你将 (char s[] ) s 用作数组,将其用作指针
请尽可能尽快回复。我也不想使用 strlen()
.
指针不保留指向单个对象或数组第一个元素的信息。
考虑以下示例
char *p;
char c = 'A';
p = "Hello";
p = &c;
正如所见,同一个指针可以指向具有类型 char[6]
的字符串文字 "Hello"(它的第一个字符)和单个字符 c.
通常,当将字符数组传递给函数时,它会隐式转换为指向其第一个元素的指针。但是,如果您将传递一个指向整个数组的指针,那么您可以使用 sizeof 运算符来确定它的大小。
例如
#include <stdio.h>
void f( char (*p)[6] )
{
printf( "%zu\n", sizeof( *p ) );
}
int main( void )
{
f( &"Hello" );
}
但这种方法有一个缺点,即在函数参数的声明中,您必须通过引用预先指定接受数组的大小。
因此,如果需要知道函数内数组的大小,一般方法是声明带有附加参数的函数,该参数指定传递的数组的大小。
考虑到一个字符串可以包含在一个字符数组中,该数组的大小远大于存储该字符串所需的大小。因此,要确定字符串本身的大小,您应该使用标准字符串函数 strlen
.
只有一种方法:
#include <stdio.h>
int main()
{
char s[] = "hello world!";
printf("%s -> %zu\n", s, sizeof s - 1);
}
你需要将s
声明为数组,而不是指针,sizeof
运算符,应用于指针,给你大小一个指针变量,它不是数组的大小(也不是你想要的)。
如您所见,我在声明中初始化数组,所以我不需要将大小放在括号之间(这不适用于赋值语句,它必须是带有初始化程序的声明)然后我减去一个到数组的大小,因为 sizeof
运算符给我数组的大小(不是字符串长度),这包括末尾 [=15=]
字符的 space。
当你运行它时:
$ a.out
hello world! -> 12
$ _