C中字符串定义的细节是什么?

What are the specifics of the definition of a string in C?

我应该为我的 类 回答一个家庭作业问题。具体来说,我应该说 C 中的某些数组是否被视为字符串。根据这篇文章 (https://www.geeksforgeeks.org/strings-in-c-2/) 我知道字符串是一个字符数组,末尾有空终止符。

我的主要问题是问题的一部分,它询问的数组如下所示:

char c1[] = { 'C', 'S', '[=10=]', '3', '2', '4', '[=10=]' };

这显然是一个字符数组,末尾有一个空终止符。但是,它仍然被认为是一个字符串,因为它在中间也有一个空终止字符吗?这将如何影响字符串?

编辑: 根据评论,我提供了问题的实际措辞:

"Which of the following arrays can be considered "strings" 用于将它们用作 strcpy()、strncpy()、strcmp()、strncmp() 和类似字符串函数的参数(表示所有应用)?" =12=]

编辑: 我给我的教授发了电子邮件,因为这个问题的措辞似乎含糊不清(正如几个人指出的那样)。如果有人好奇,他告诉我"Yes it is a string. The key is that there is a null character. But of course that will effect any string operations; the string ends at the null character."

c1 主要是 [1] 等同于 &c1[0],它持有一个字符串,"CS".

那里潜伏着第二个字符串,"324",从 &c1[3] 开始——但只要您以 c1 访问 c1,字符串 "CS" 是所有函数 strcpy() 等。会看到。


[1]:c1是数组,&c1[0]是指针。

如果您想了解 C 中字符串定义的细节,请转到源代码。

From the C90 standard:

7 Library

7.1 Introduction

7.1.1 Definitions of terms
A string is a contiguous sequence of characters terminated by and including the first null character. A “pointer to” a string is a pointer to its initial (lowest addressed) character. The “length” of a string is the number of characters preceding the null character and its “value” is the sequence of the values of the contained characters, in order.

(后期标准无相关变化)

因此,c1 包含两个连续的字符串,“CS”和“324”,但它本身不是一个字符串。

如果我们将一个数组传递给一个函数,它会衰减到指向其第一个元素的指针,因此 +c1 指向一个字符串(第一个),这对于任何需要指针的函数来说已经足够了串起来。它不指向字符串“CS24”,但这可能足以解决您的教师问题,这是模棱两可的。

添加到@DevSolar 的答案,这是我在玩弄给定字符串后发现的,如果它是:

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };

如果你输出这个字符串,你会得到CS03240,这个字符串的大小是7。据我的理解,\0用来表示空字符( [=15=])。如果你这样做:

printf("[=11=]");

您在输出日志中看不到任何内容,但如果您看到:

printf("\0");

您看到 [=15=],这是预期的,因为要输出反斜杠或引号等特殊字符,您需要与它们一起使用 \

令我困惑的是输出 CS03240 并且它的大小为 7。通常理解字符串的大小是其中的字符数加上一个(对于空字符)。此外,即使字符串的大小也是 7, char c1[] = { 'C', 'S', '[=19=]', '3', '2', '4', '[=19=]' };.

所以也许可以跟进这个问题,这是怎么回事?