我读到:
char pattern[] = "ould";
基本上是写成:
char pattern[] = { 'o', 'u', 'l', 'd', '\0' };
我知道空字符 \0
标记了字符串的结尾,但如果我这样写会怎么样:
char pattern[] = { 'o', 'u', 'l', 'd'};
(没有 \0)
它仍然可以编译。
如果没有 \0
的 pattern
会在哪些情况下引起问题呢?因为它似乎能够编译而没有警告 (-Wall
)。
我读到:
char pattern[] = "ould";
基本上是写成:
char pattern[] = { 'o', 'u', 'l', 'd', '\0' };
我知道空字符 \0
标记了字符串的结尾,但如果我这样写会怎么样:
char pattern[] = { 'o', 'u', 'l', 'd'};
(没有 \0)
它仍然可以编译。
如果没有 \0
的 pattern
会在哪些情况下引起问题呢?因为它似乎能够编译而没有警告 (-Wall
)。
char
数组,所以将其传递给任何期望一个字符串的函数都会导致错误。例如:strlen
,作为strcpy
的源参数,作为带有%s
格式说明符的printf
的...
参数等。这不是编译器警告,而是逻辑警告。如果你在使用strcpy
时没有加上\0
,你可能会破坏你的堆栈。
在编译器方面,这不会造成问题。但是,在许多函数(如printf
)中,假设当您通过%s格式说明符传入某些内容时,它将以'\0'结尾,这是可能会引起问题的。
但是,如果您仅将该数组传递到您编写的函数中,或者在其中将数组长度作为单独的参数传递,并且它们都知道其长度,则不会引起问题。
char string[] = "abcd"; /*is valid at the end is the \0, 5 chars were allocated*/
char str[3] = {'\0'}; /* all are \0 */
strncpy(str, string, 2); /*strcpy doesn't add \0*/
str[3] = '\0'; /* now is everything fine! */
str[2] = '\0';
。str有足够的空间容纳3个字节,而你正在尝试将其第4个字节设置为0。 - pmg如果你把它当作字符串处理,那就会出现问题。例如,使用strcmp、strcpy、printf等函数时,它们都期望找到空字符终止符,因此肯定会遇到问题。
只要你始终将其视为字符数组,那么普通的字符数组就没问题了。例如:
char c = pattern[2];
当然它可以编译——这是一个有效的C程序。问题会出现在你试图将字符数组传递给期望以空字符'\0'结尾的字符串(即字符数组)的函数时。
strlen(pattern)
\0
会使字符数组成为C字符串?(我是C的新手) - user225312\0
,这样你就不必传递长度了。这只是一个约定,但许多库函数都广泛遵守,无论是标准库还是第三方库。 - Sergei Tachenov