在 C 程序中使用 0 而不是 '\0'
using 0 instead of '\0' in C program
为什么我的程序没有进入无限循环。我没有使用 '[=11=]'
来测试 while 循环中的字符串结尾,而是使用 0
。 '[=11=]'
和 0
在 C 中是否相同?
如果是,那么如果 0
在字符串的中间,那么 printf
应该在那里结束打印字符串。
例如printf("%s", "hello how0 are you")
应该打印 'hello how'
int main( )
{
char s[ ] = "No two viruses work similarly" ;
int i = 0 ;
while ( s[i] != 0 )
{
printf ( "%c", s[i]) ;
i++ ;
}
}
0是字符'\0'的ascii值。
0 不是“0”字符的 ascii 值。
'[=10=]'
与0
的含义相同,但'0'
与0
的含义不同。
printf("%s", "hello how0 are you")
将打印 hello how0 are you
.
printf("%s", "hello how[=16=] are you")
将打印 hello how
.
在C语言中,'\0'与整型常量0完全相同(同值零,同类型int)。
此外,对于阅读代码的人来说,写 '\0' 表明您打算使用这个特定的零作为字符(空)。
在 C 源代码中,0
和 '[=11=]'
实际上是相同的:每个都是一个值为零的 int
常量。 '[=11=]'
用于指示我们正在处理字符,但它与编译器的 0
相同。 (在 C++ 中,'[=11=]'
是 char
而不是 int
。)
显示字符“0”的代码不为零。在 ASCII 中,它是 48。在任何 C 实现中,它都可以写成 '0'
。这个值总是正数而不是零,即使 C 实现使用 ASCII 以外的一些字符编码。所以在字符串中间有一个字符“0”不会作为空终止符。
我想把它放到评论中,但评论太长了。
Does '[=14=]' and 0 same in C
我建议你试试这个:
int main( )
{
char s[ ] = "No two viruses work similarly" ;
int i = 0 ;
while ( s[i] != 0 )
{
printf ( "%d", s[i]); // this will print decimal values of
// all characters before `[=10=]`
++i;
}
printf ("%d", s[i]); // this will print decimal value of `[=10=]`
}
您也可以这样做:
printf("%d\n", '[=11=]');
它会回答你的第一个问题。
If yes, then if 0 is in the middle of a string, then printf should end printing the string right there. e.g. printf("%s", "hello how0 are you") should print 'hello how'.
"" 或 '' 中的 0 被视为 ASCII 字符,因此试试这个:
printf("%d\n", '0');
那应该给你 ASCII 字符“0”的十进制值。并查看 ASCII 字符 table.
作为一项有趣的练习,您可以这样做:
printf("%d\n", '0' - '[=13=]');
Does '[=15=]' and 0 same in C?
是的,它们是相同整数常量 0 的不同写法。C 中的两个常量(与 C++ 相反)具有类型 int
和相同的表示形式。
why my program did not go in infinite loop. I have not used '[=16=]' for
testing string end in while loop, instead of that I have use 0
这个while循环中的条件
while ( s[i] != 0 )
相当于条件
while ( s[i] != '[=11=]' )
正如上面指出的那样。
if 0 is in the middle of a string, then printf should end printing the
string right there. e.g. printf("%s", "hello how0 are you") should
print 'hello how'
这个字符串文字
"hello how0 are you"
没有嵌入零字符。这个带有嵌入零字符的字符串可以通过以下方式查找例如
"hello how[=13=] are you"
'[=12=]'
和0
在C中是等价的,因为ASCII(ANSI、UTF-8等)字符编码定义了'[=12=]'
字符的编码为0
.在C语言中,可以将字符隐式转换为整数,得到的整数将等于字符编码(例如,'A'
将转换为65
)。
如果您将字符串的一个字符设置为 '[=12=]'
或 0
,它将终止该字符串。
测试码(online):
#include <stdio.h>
int main() {
// Are they equal? Yes!
char zc = '[=10=]';
char zi = 0;
printf("%d\n", zc == zi); // Prints 1
// Does setting a char to 0 terminate a string? Yes!
char s[] = "hello, world";
printf("%s\n", s); // Prints hello, world
s[5] = 0;
printf("%s\n", s); // Prints hello
return 0;
}
同样重要的是,字符串文字,如上面代码中的 s
,自动具有终止字符 '[=12=]'
,但它不会显示在字符串文字中。
将内部 '[=12=]'
字符放入字符串文字中可能听起来很愚蠢,因为字符串的长度定义为第一个 '[=12=]'
之前的字符数,而 printf 也只打印这些人物。但是内部 '[=12=]'
s 确实在实践中使用,例如在 Windows (link, link) 上为 Open/Save 文件对话框设置文件类型过滤器时。这里内部零字符用作过滤器分隔符:
ofn.lpstrFilter = "Text files (*.txt)[=11=]*.txt[=11=]All files (*.*)[=11=]*.*[=11=]";
在C语言中,对于每一个字符,都有一个对应的ASCII值,基本上是0到127之间的整数。
例如,当您声明:
char a[] = "Hello";
然后,数组实际上有 6 个元素,而不是 5。您可以使用以下方法对其进行测试:
int n = sizeof(s)/sizeof(s[0]);
printf("%d\n", n);
该字符串的实际表示形式已变为:Hello[=55=]
在这里,您可以看到 \ 符号,它被称为 Escape Character,类似于对该字符的另一种解释。这里 \0 表示 char 数组索引上的 ASCII 值 0。但是,如果没有转义字符,0 只是一个普通字符 - 而不是替代表示。
现在如果要查看上一个字符串的每个字符对应的ASCII值 - 你好, 运行 this:
int i;
for (i = 0; i < 6; i++) {
printf("%d ", s[i]);
}
// Output: 72 101 108 108 111 0
现在关于你原来的问题:
Does '[=13=]' and 0 same in C?
ASCII 0 和 char 0 是不同的。但是char\0代表的ASCII值是0.
0
和 '[=13=]'
是一样的,但我们不只是这么说,我们来解释一下这些不同的零输入方式到底是什么。
在C语言中有很多情况可以使用整数值0
。显然,它可以用作普通整数或数组索引。但它也可以用来创建一个空指针。还有一个用途是字符串的空终止。
由于空指针和字符串的空终止是截然不同的东西,所以混淆术语的风险很大。在黑暗时代的某个时候,通过将空指针称为 NULL
并创建一个这样命名的宏来进行区分,扩展为空指针常量。符号 table 中的字符 0(“空字符”)被称为带有单个 L 的 NUL
。仍然令人困惑。
此外,C 从未为空终止定义转义序列,就像换行 \n
、制表符 \n
等所做的那样。因此,当是字符串的一部分时,无法键入空终止字符。
然后有人(Kernighan 和 Ritchie?)想到了使用 C 中其他已经存在的转义序列来达到这个目的。在字符串或字符文字中,我们可以使用转义序列在 table 中键入符号的索引。这可以使用八进制或十六进制表示法来完成。
例如,具有十进制值 10
的换行符可以在字符串中输入为 2
(八进制)或 \xA
(十六进制)。这些被称为 octal/hexadecimal 转义序列。示例:
puts("test\ntest2test\xAtest");
给予
test
test
test
test
同样,我们可以使用八进制[=22=]
或十六进制\x0
的转义序列来编写空字符。八进制版本成为空终止的惯例和事实上的标准。
'[=14=]'
是 value 0 的字符。它用于终止 C 中的字符串。所以,是的,循环
while ( s[i] != 0 )
工作得很好,虽然更传统的写法是
while ( s[i] != '[=11=]' )
强调我们正在处理角色。
另一方面,'0'是看起来像数字0的字符,虽然这个字符的值在ASCII 字符集是 48。但无论如何该值都不是 0!所以当你写
printf("%s", "hello how0 are you");
它打印 hello how0 are you
,因为 0
是一个普通字符,不会终止字符串。如果你写
printf("%s", "hello how[=13=] are you");
然后你会有一个空字符,它会终止字符串。
为什么我的程序没有进入无限循环。我没有使用 '[=11=]'
来测试 while 循环中的字符串结尾,而是使用 0
。 '[=11=]'
和 0
在 C 中是否相同?
如果是,那么如果 0
在字符串的中间,那么 printf
应该在那里结束打印字符串。
例如printf("%s", "hello how0 are you")
应该打印 'hello how'
int main( )
{
char s[ ] = "No two viruses work similarly" ;
int i = 0 ;
while ( s[i] != 0 )
{
printf ( "%c", s[i]) ;
i++ ;
}
}
0是字符'\0'的ascii值。 0 不是“0”字符的 ascii 值。
'[=10=]'
与0
的含义相同,但'0'
与0
的含义不同。
printf("%s", "hello how0 are you")
将打印 hello how0 are you
.
printf("%s", "hello how[=16=] are you")
将打印 hello how
.
在C语言中,'\0'与整型常量0完全相同(同值零,同类型int)。
此外,对于阅读代码的人来说,写 '\0' 表明您打算使用这个特定的零作为字符(空)。
在 C 源代码中,0
和 '[=11=]'
实际上是相同的:每个都是一个值为零的 int
常量。 '[=11=]'
用于指示我们正在处理字符,但它与编译器的 0
相同。 (在 C++ 中,'[=11=]'
是 char
而不是 int
。)
显示字符“0”的代码不为零。在 ASCII 中,它是 48。在任何 C 实现中,它都可以写成 '0'
。这个值总是正数而不是零,即使 C 实现使用 ASCII 以外的一些字符编码。所以在字符串中间有一个字符“0”不会作为空终止符。
我想把它放到评论中,但评论太长了。
Does '[=14=]' and 0 same in C
我建议你试试这个:
int main( )
{
char s[ ] = "No two viruses work similarly" ;
int i = 0 ;
while ( s[i] != 0 )
{
printf ( "%d", s[i]); // this will print decimal values of
// all characters before `[=10=]`
++i;
}
printf ("%d", s[i]); // this will print decimal value of `[=10=]`
}
您也可以这样做:
printf("%d\n", '[=11=]');
它会回答你的第一个问题。
If yes, then if 0 is in the middle of a string, then printf should end printing the string right there. e.g. printf("%s", "hello how0 are you") should print 'hello how'.
"" 或 '' 中的 0 被视为 ASCII 字符,因此试试这个:
printf("%d\n", '0');
那应该给你 ASCII 字符“0”的十进制值。并查看 ASCII 字符 table.
作为一项有趣的练习,您可以这样做:
printf("%d\n", '0' - '[=13=]');
Does '[=15=]' and 0 same in C?
是的,它们是相同整数常量 0 的不同写法。C 中的两个常量(与 C++ 相反)具有类型 int
和相同的表示形式。
why my program did not go in infinite loop. I have not used '[=16=]' for testing string end in while loop, instead of that I have use 0
这个while循环中的条件
while ( s[i] != 0 )
相当于条件
while ( s[i] != '[=11=]' )
正如上面指出的那样。
if 0 is in the middle of a string, then printf should end printing the string right there. e.g. printf("%s", "hello how0 are you") should print 'hello how'
这个字符串文字
"hello how0 are you"
没有嵌入零字符。这个带有嵌入零字符的字符串可以通过以下方式查找例如
"hello how[=13=] are you"
'[=12=]'
和0
在C中是等价的,因为ASCII(ANSI、UTF-8等)字符编码定义了'[=12=]'
字符的编码为0
.在C语言中,可以将字符隐式转换为整数,得到的整数将等于字符编码(例如,'A'
将转换为65
)。
如果您将字符串的一个字符设置为 '[=12=]'
或 0
,它将终止该字符串。
测试码(online):
#include <stdio.h>
int main() {
// Are they equal? Yes!
char zc = '[=10=]';
char zi = 0;
printf("%d\n", zc == zi); // Prints 1
// Does setting a char to 0 terminate a string? Yes!
char s[] = "hello, world";
printf("%s\n", s); // Prints hello, world
s[5] = 0;
printf("%s\n", s); // Prints hello
return 0;
}
同样重要的是,字符串文字,如上面代码中的 s
,自动具有终止字符 '[=12=]'
,但它不会显示在字符串文字中。
将内部 '[=12=]'
字符放入字符串文字中可能听起来很愚蠢,因为字符串的长度定义为第一个 '[=12=]'
之前的字符数,而 printf 也只打印这些人物。但是内部 '[=12=]'
s 确实在实践中使用,例如在 Windows (link, link) 上为 Open/Save 文件对话框设置文件类型过滤器时。这里内部零字符用作过滤器分隔符:
ofn.lpstrFilter = "Text files (*.txt)[=11=]*.txt[=11=]All files (*.*)[=11=]*.*[=11=]";
在C语言中,对于每一个字符,都有一个对应的ASCII值,基本上是0到127之间的整数。
例如,当您声明:
char a[] = "Hello";
然后,数组实际上有 6 个元素,而不是 5。您可以使用以下方法对其进行测试:
int n = sizeof(s)/sizeof(s[0]);
printf("%d\n", n);
该字符串的实际表示形式已变为:Hello[=55=]
在这里,您可以看到 \ 符号,它被称为 Escape Character,类似于对该字符的另一种解释。这里 \0 表示 char 数组索引上的 ASCII 值 0。但是,如果没有转义字符,0 只是一个普通字符 - 而不是替代表示。
现在如果要查看上一个字符串的每个字符对应的ASCII值 - 你好, 运行 this:
int i;
for (i = 0; i < 6; i++) {
printf("%d ", s[i]);
}
// Output: 72 101 108 108 111 0
现在关于你原来的问题:
Does '[=13=]' and 0 same in C?
ASCII 0 和 char 0 是不同的。但是char\0代表的ASCII值是0.
0
和 '[=13=]'
是一样的,但我们不只是这么说,我们来解释一下这些不同的零输入方式到底是什么。
在C语言中有很多情况可以使用整数值0
。显然,它可以用作普通整数或数组索引。但它也可以用来创建一个空指针。还有一个用途是字符串的空终止。
由于空指针和字符串的空终止是截然不同的东西,所以混淆术语的风险很大。在黑暗时代的某个时候,通过将空指针称为 NULL
并创建一个这样命名的宏来进行区分,扩展为空指针常量。符号 table 中的字符 0(“空字符”)被称为带有单个 L 的 NUL
。仍然令人困惑。
此外,C 从未为空终止定义转义序列,就像换行 \n
、制表符 \n
等所做的那样。因此,当是字符串的一部分时,无法键入空终止字符。
然后有人(Kernighan 和 Ritchie?)想到了使用 C 中其他已经存在的转义序列来达到这个目的。在字符串或字符文字中,我们可以使用转义序列在 table 中键入符号的索引。这可以使用八进制或十六进制表示法来完成。
例如,具有十进制值 10
的换行符可以在字符串中输入为 2
(八进制)或 \xA
(十六进制)。这些被称为 octal/hexadecimal 转义序列。示例:
puts("test\ntest2test\xAtest");
给予
test
test
test
test
同样,我们可以使用八进制[=22=]
或十六进制\x0
的转义序列来编写空字符。八进制版本成为空终止的惯例和事实上的标准。
'[=14=]'
是 value 0 的字符。它用于终止 C 中的字符串。所以,是的,循环
while ( s[i] != 0 )
工作得很好,虽然更传统的写法是
while ( s[i] != '[=11=]' )
强调我们正在处理角色。
另一方面,'0'是看起来像数字0的字符,虽然这个字符的值在ASCII 字符集是 48。但无论如何该值都不是 0!所以当你写
printf("%s", "hello how0 are you");
它打印 hello how0 are you
,因为 0
是一个普通字符,不会终止字符串。如果你写
printf("%s", "hello how[=13=] are you");
然后你会有一个空字符,它会终止字符串。