是否可以使用指针创建字符串变量?这样我就不必每次都传递它的大小,比如 char x[4] = "aaa"?
我怎样才能得到这样的字符串的大小?
我可以用指针初始化一个空字符串吗?
请记住,C 中的字符串以空终止符结尾,写为\0
. 如果您的指针变量中存储了格式正确的字符串,则可以通过搜索此字符来确定长度:
char *x = "hello"; // automatically appends a null terminator
int len = 0;
while (x[len] != '\0') {
len++;
}
如果您的变量未初始化或格式不正确(例如,通过 be NULL
),您显然不能采用这种方法;但是,大多数函数通常是在字符串格式良好的假设下编写的,因为这会导致代码更快。
如果您希望初始化一个指针,您有三个选项:NULL
、有效地址(例如,char *x = &someCharVar
)或字符串常量(例如,char *x = "hello"
)。请注意,如果您使用字符串常量,则写入该指针是非法的,除非您使用非常量字符串的地址重新分配给它。
// Get enough space for 24 characters plus null terminator
char *myString = (char*) malloc(25 * sizeof(char));
strcpy(myString, "some text"); // fill the new memory
fgets(myString, 25, stdin); // fill with keyboard input
注意sizeof(char)
这里是不必要的,因为 achar
总是被定义为正好 1 个字节。但是,当您使用其他数据类型时,养成这种习惯是一个好习惯,它可以通过使您的意图非常清晰来帮助您的代码自我记录。
如果您使用字符串文字初始化数组char
,则无需指定大小:
char str[] = "This is a test";
这将创建str
一个 15 元素数组char
(大小取自初始化器的长度,包括 0 终止符)并将字符串文字的内容复制到其中。
字符串文字是类型为“N 元素数组”(在 C++ 中)的数组表达式。除非它被用于在声明中初始化一个数组(例如上面)或者是一元运算符或一元运算符的操作数, “array of ”类型的表达式将被转换为“pointer to ”类型的表达式,并且表达式的值将是数组第一个元素的地址。 char
const char
sizeof
&
T
T
如果你写
const char *str = "This is a test";
表达式“This is a test”从“15-element array of char
”类型转换为“pointer to char
”,表达式的值是第一个字符的地址,写入变量str
。
试图修改字符串文字内容的行为是未定义的;有些平台将字符串文字存储在只读内存中,有些则没有。有些将同一字符串文字的多次出现映射到单个实例,有些则不映射。最好始终将字符串文字视为不可修改,这就是我声明str
为const char *
而不是 just的原因char *
。
要获取字符串的长度,请使用strlen
:
char str[] = "This is a test"; // or const char *str = "This is a test";
size_t len = strlen(str); // or strlen("This is a test");
这将返回字符串中最多(但不包括)0 终止符的字符数;strlen("This is a test")
将返回 14。
要获取包含字符串的缓冲区的大小,您可以使用sizeof
运算符:
char str[] = "This is a test";
size_t len = sizeof str; // or sizeof "This is a test"
请注意,如果您声明为指针,这不会给您缓冲区的大小str
,例如
const char *str = "This is a test";
在这种情况下,sizeof str;
只给你 a 的大小char *
,而不是它指向的字符串。