是否可以使用指针创建字符串变量?所以我不必每次都传递它的大小,比如char x [4] =“aaa”?
如何获得此类字符串的大小?
我可以用指针初始化一个空字符串吗?
答案 0 :(得分:8)
请记住,C中的字符串以 null终结符字符结束,写为\0
。如果您的指针变量中存储了格式正确的字符串,则可以通过搜索此字符来确定长度:
char *x = "hello"; // automatically appends a null terminator
int len = 0;
while (x[len] != '\0') {
len++;
}
如果您的变量未初始化或者格式不正确(例如,通过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)
,因为char
始终定义为1个字节。但是,当您使用其他数据类型时,这是一个很好的习惯,并且通过使您的意图非常清晰,它有助于使您的代码自我记录。
答案 1 :(得分:2)
如果您使用字符串文字初始化char
数组,则无需指定大小:
char str[] = "This is a test";
这将创建str
作为15个元素的char
数组(大小取自initiliazer的长度,包括0终止符)并将字符串文字的内容复制到它。
字符串文字是数组表达式,类型为“{元素数组char
”(C ++中的const char
)。除非它用于初始化声明中的数组(如上所述)或是sizeof
或一元&
运算符的操作数,否则表达式为“T
数组“将转换为类型为”T
“的表达式,表达式的值将是数组第一个元素的地址。
如果你写
const char *str = "This is a test";
表达式“This is a test”从“{-l}的15个元素数组”转换为“char
的指针”,表达式的值是第一个的地址字符,写入变量char
。
尝试修改字符串文字内容时的行为是 undefined ;某些平台将字符串文字存储在只读内存中,有些则不存储。有些将同一字符串文字的多次出现映射到单个实例,而有些则不映射。最好始终将字符串文字视为不可修改,这就是为什么我将str
声明为str
而不仅仅是const char *
。
要获取字符串的长度,请使用char *
:
strlen
这将返回字符串中的字符数,直到(但不包括)0终止符; 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");
将返回14.
要获取包含字符串的缓冲区的大小,可以使用strlen("This is a test")
运算符:
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;
的大小,而不是它指向的字符串。