作者:fanhua1 | 来源:互联网 | 2023-06-03 13:36
为什么我的程序没有进入无限循环。我没有用''while 循环测试字符串结尾,而是使用0. 是否''与0同在C 2如果是,那么如果0在字符串的中间,那么printf应该在那里结束打印字符串。例如 pri
为什么我的程序没有进入无限循环。我没有用''
while 循环测试字符串结尾,而是使用0
. 是否''
与0
同在C 2
如果是,那么如果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'
与 的含义不同0
。
printf("%s", "hello how0 are you")
将打印hello how0 are you
。
printf("%s", "hello how are you")
将打印hello how
。
回答
在 C 语言中,'' 的含义与整数常量 0 完全相同(相同的值零,相同的类型 int)。
此外,对于阅读代码的人来说,写 '' 表明您打算使用这个特定的零作为字符(空)。
回答
''
和0
在 C 中相等,因为 ASCII(ANSI、UTF-8 等)字符编码将字符的代码定义''
为0
. 在 C 中,可以将字符隐式转换为整数,生成的整数将等于字符代码(例如,'A'
将转换为65
)。
如果您将字符串的一个字符设置为''
或0
,它将终止该字符串。
测试代码(在线):
#include
int main() {
// Are they equal? Yes!
char zc = '';
char zi = 0;
printf("%dn", zc == zi); // Prints 1
// Does setting a char to 0 terminate a string? Yes!
char s[] = "hello, world";
printf("%sn", s); // Prints hello, world
s[5] = 0;
printf("%sn", s); // Prints hello return 0;
}
同样重要的是,字符串文字(如s
上面的代码中)会自动具有终止''
字符,但它不会显示在字符串文字中。
将内部''
字符放入字符串文字中可能听起来很愚蠢,因为字符串的长度被定义为第一个之前的字符数''
,而 printf 也只打印这些字符。但是 internal''
确实在实践中使用,例如在 Windows 上为 Open/Save File 对话框设置文件类型过滤器(link,link)。这里内部零字符用作过滤器分隔符:
ofn.lpstrFilter = "Text files (*.txt)*.txtAll files (*.*)*.*";
回答
在 C 源代码中,0
和''
实际上是相同的:每个都是int
值为零的常量。''
用于表示我们正在处理字符,但它0
与编译器相同。(在 C++ 中,''
是一个char
而不是一个int
。)
显示字符“0”的代码不为零。在 ASCII 中,它是 48。在任何 C 实现中,它都可以写成'0'
. 即使 C 实现使用除 ASCII 以外的某些字符编码,此值也将始终为正数而不是零。因此,字符串中间的字符“0”不会充当空终止符。
回答
'' 和 0 在 C 中相同吗?
是的,它们是编写相同整数常量 0 的不同方式。 C 中的两个常量(与 C++ 相反)具有类型int
和相同的表示形式。
为什么我的程序没有进入无限循环。我没有使用 '' 来测试 while 循环中的字符串结尾,而是使用了 0
这个while循环中的条件
while ( s[i] != 0 )
while ( s[i]
while ( s[i] != '' )
while ( s[i] != '' )
!= 0 )
等价于条件
正如上面指出的那样。
如果 0 在字符串的中间,那么 printf 应该在那里结束打印字符串。例如 printf("%s", "hello how0 are you") 应该打印 'hello how'
这个字符串文字
"hello how0 are you"
没有嵌入的零字符。这个带有嵌入零字符的字符串可以通过以下方式查找
"hello how are you"
回答
0
并且''
是相同的,但与其说是这样,不如解释一下这些不同的输入零的方式实际上是什么。
在 C 中有很多0
可以使用整数值的情况。显然,它可以用作普通整数或数组索引。但它也可用于创建空指针。还有一个用途是字符串的空终止。
由于空指针和字符串的空终止是截然不同的事物,因此混淆术语的风险很大。在黑暗时代的某个时候,通过将空指针称为NULL
并创建一个类似命名的宏,扩展为空指针常量来区分。符号表中的字符 0(“空字符”)被称为NUL
单个 L。仍然令人困惑。
此外,C 从未为空终止定义转义序列,就像为换行符n
、制表符n
等所做的那样。因此,当作为字符串的一部分时,无法输入空终止字符。
然后有人(Kernighan & Ritchie?)想出了在 C 中使用其他已经存在的转义序列的想法。在字符串或字符文字中,我们可以使用转义序列来键入表中符号的索引。这可以使用八进制或十六进制表示法来完成。
例如,带有十进制值的换行符10
可以在字符串中输入为12
(八进制)或xA
(十六进制)。这些被称为八进制/十六进制转义序列。例子:
puts("testntest12testxAtest");
给
test
test
test
test
同样,我们可以使用转义序列编写空字符,八进制
或十六进制x0
。八进制版本成为空终止的惯例和事实上的标准。
回答
''
是值为0的字符。它用于终止 C 中的字符串。所以,是的,循环
工作得很好,虽然更传统的写作方式是
强调我们正在处理角色。
在另一方面,“0”是字符看起来像数字0,虽然值这个人物在ASCII字符集为48个,但在任何情况下,值不为0!所以当你写
printf("%s", "hello how0 are you");
它打印hello how0 are you
,因为0
是一个普通字符,并且不会终止字符串。如果你写
printf("%s", "hello how are you");
那么你会有一个空字符,它会终止字符串。
回答
0 是字符 '' 的 ascii 值。0 不是 '0' 字符的 ascii 值。
回答
我会把它放在评论中,但评论太长了。
'' 和 0 在 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 ``
++i;
}
printf ("%d", s[i]); // this will print decimal value of ``
}
你也可以这样做:
printf("%dn", '');
它会回答你的第一个问题。
如果是,那么如果 0 在字符串的中间,那么 printf 应该在那里结束打印字符串。例如 printf("%s", "hello how0 are you") 应该打印 'hello how'。
"" 或 '' 中的 0 被视为 ASCII 字符,因此试试这个:
printf("%dn", '0');
这应该给你 ASCII 字符“0”的十进制值。并查看 ASCII 字符表。
作为有趣的练习,您可以这样做:
printf("%dn", '0' - '');
回答
在C中,对于每个字符,都有一个对应的ASCII值,基本上是0到127之间的整数。
例如,当您声明:
char a[] = "Hello";
然后,该数组实际上有6 个元素,而不是5 个。您可以使用以下方法对其进行测试:
int n = sizeof(s)/sizeof(s[0]);
printf("%dn", n);
该字符串的实际表示已变为:Hello
在这里,您可以看到符号,它被称为转义字符,类似于该字符的另一种解释。这里表示字符数组索引上的ASCII 值0。但是,没有转义字符,0只是一个普通字符 - 不是替代表示。
现在,如果要查看前一个字符串 - Hello中每个字符的相应 ASCII 值,请运行以下命令:
int i;
for (i = 0; i <6; i++) {
printf("%d ", s[i]);
}
// Output: 72 101 108 108 111 0
现在关于你的原始问题:
'' 和 0 在 C 中相同吗?
ASCII 0和 char 0是不同的。但字符 0表示ASCII值0。