1

是否可以使用指针创建字符串变量?这样我就不必每次都传递它的大小,比如 char x[4] = "aaa"?

我怎样才能得到这样的字符串的大小?

我可以用指针初始化一个空字符串吗?

4

2 回答 2

9

请记住,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 个字节。但是,当您使用其他数据类型时,养成这种习惯是一个好习惯,它可以通过使您的意图非常清晰来帮助您的代码自我记录。

于 2012-11-15T20:24:33.820 回答
3

如果您使用字符串文字初始化数组char,则无需指定大小:

char str[] = "This is a test";

这将创建str一个 15 元素数组char(大小取自初始化器的长度,包括 0 终止符)并将字符串文字的内容复制到其中。

字符串文字是类型为“N 元素数组”(在 C++ 中)的数组表达式。除非它被用于在声明中初始化一个数组(例如上面)或者是一元运算符或一元运算符的操作数, “array of ”类型的表达式将被转换为“pointer to ”类型的表达式,并且表达式的值将是数组第一个元素的地址。 charconst charsizeof&TT

如果你写

const char *str = "This is a test";

表达式“This is a test”从“15-element array of char”类型转换为“pointer to char”,表达式的值是第一个字符的地址,写入变量str

试图修改字符串文字内容的行为是未定义的;有些平台将字符串文字存储在只读内存中,有些则没有。有些将同一字符串文字的多次出现映射到单个实例,有些则不映射。最好始终将字符串文字视为不可修改,这就是我声明strconst 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 *,而不是它指向的字符串。

于 2012-11-15T21:06:57.020 回答