使用“while”打印字符数组

时间:2015-05-29 11:57:23

标签: c string

所以这是工作版本:

#include <stdio.h>

int main(int argc, char const *argv[]) {
    char myText[] = "hello world\n";
    int counter = 0;
    while(myText[counter]) {
        printf("%c", myText[counter]);
        counter++;
    }
}

并在行动中:

Korays-MacBook-Pro:~ koraytugay$ gcc koray.c
Korays-MacBook-Pro:~ koraytugay$ ./a.out 
hello world

我的问题是,为什么这段代码工作正常?何时(或如何)

while(myText[counter])

评估为假?

这两项工作也是如此:

while(myText[counter] != '\0')
while(myText[counter] != 0)

这个在控制台中打印垃圾:

while(myText[counter] !=  EOF)

,甚至不编译:

while(myText[counter] != NULL)

我可以看到'\0'的工作原理,因为C在编译时将此字符放在数组的末尾。但为什么NULL不起作用? 0 == '\0'怎么样?

5 个答案:

答案 0 :(得分:5)

AS的最后一个问题,

  

但为什么NULL不工作?

通常,NULL是指针类型。此处,myText[counter]char类型的值。根据使用==运算符的条件,来自C11标准,第6.5.9章,

  

以下其中一项应成立:

     
  1. 两个操作数都有算术类型;   
  2. 两个操作数都是指向兼容类型的限定或非限定版本的指针;   
  3. 一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的void的指针;要么   
  4. 一个操作数是指针,另一个是空指针常量。   

因此,它告诉您, 只能 将指针类型与空指针常量进行比较 ## NULL)。

之后,

  

while(myText[counter])何时(或如何)评估为假?

很简单,当myText[counter]的值为0时。

详细说明,在初始化之后,myText保存用于初始化它的字符值,使用&#34; null&#34;最后。 &#34; null&#34;是C标识字符串端点的方式。现在,null由值0表示。所以,我们可以说。到达字符串结尾时,while() FALSE

补充说明:

  • while(myText[counter] != '\0')有效,因为'\0'代表&#34; null&#34;用作字符串终止符。

  • while(myText[counter] != 0)有效,因为0'\0'的十进制值。

以上两个陈述均为while(myText[counter])等效

  • while(myText[counter] != EOF)不起作用,因为null不是EOF

参考:(#)

参考:C11标准,第6.3.2.3章,指针,第3段

  

值为0的整型常量表达式,或者类型为void *的表达式,称为空指针常量

,并从第7.19节开始,

  

NULL
  它扩展为实现定义的空指针常量

注意:最后,如果您有任何问题,this question和实际答案将清除混淆。

答案 1 :(得分:2)

  

何时(或如何)这项工作?

while(myText[counter])

任何值为零的内置函数都将在布尔上下文中计算为false。因此,当while(myText[counter])myText[counter]时,'\0'0,其值为'\0'

  

如何0 =='\ 0'?

在语言中定义了这种方式。 int0字面值,其值为零。 int也是值为零的<from uri="activemq:queue:inqueue?concurrentConsumers=1"/ <camel:loadBalance inheritErrorHandler="false"> <camel:roundRobin/> <camel:to uri="netty:tcp://0.0.0.0:0?logicalName=comp#1&amp;sync=false"/> <camel:to uri="netty:tcp://0.0.0.0:0?logicalName=comp#2&amp;sync=false"/> </camel:loadBalance> 字面值,因此两者都相等,并且它们在布尔上下文中都计算为false

答案 2 :(得分:2)

在C中,任何非零值的计算结果为true。 C字符串以空值终止。也就是说,字符串中的最后一个字符后面有一个特殊的零值字符。

所以当到达null终止符时,零值的计算结果为false,循环终止。

  

我可以看到为什么'\ 0'可以工作,因为C在编译时将这个字符放在我的数组的末尾。但是为什么NULL不起作用? 0 =='\ 0'怎么样?

0与'\ 0'具有相同的值,因为'\ 0'是值为零的字符。 (不要与'0'混淆,这是零数字,值为48。)

关于NULL,它实际上可以工作,因为它也评估为零。但是,NULL是指针类型,因此您可能必须键入强制转换以避免错误。 (很难确定,因为你没有发布你得到的错误。)

答案 3 :(得分:1)

  

如何0 =='\ 0'?

所有字符都有一个8位数字值,例如,'a'是97(十进制)。字符文字'\ 0'中的反斜杠引入了一个“转义”,通过其数值直接指定字符。在这种情况下,数值为0。

答案 4 :(得分:1)

  1. 字符串的终止是\0
  2. NULL用于初始化指向确定值的指针
  3. 只要while(myText[counter])指向零字节,

    counter的计算结果为false。

    最后,字符串末尾的零字节没有什么不同。实际上NULL意思相同,但仅在指针的上下文中用于表示法。

    如果从编码角度看不清楚某些内容,您可能需要查看调试器监视窗口内部,程序执行期间实际有哪些位和字节。