如何在 C 中用 space 或 null 停止字符串循环?

how to make a string loop stop with space or null in C?

while((str[i] != ' ') 作为出口 112
while((str[i] != '\0') 作为出口 112 12
while((str[i] != ' ') || (str[i] != '\0')) 将是 112 但它会在 str 上爆发并且不会离开循环

#include <stdio.h>
#include <string.h> 

int main(int argc, char *argv[]){

    char str[] = {"112 12"};
    int i = 0;

    while((str[i] != ' ') || (str[i] != '[=11=]')){    /*  it bursts vector  */
        printf("%c", str[i]);
        i++;
    }

    return 0;
}

您使用||。所以 while 循环永远不会中断。如果您想在 spaceend-of string 上停止,请使用 &&

#include <stdio.h>
#include <string.h> 

int main(int argc, char *argv[]) {

    char str[] = { "112 12" };
    int i = 0;

    while ((str[i] != ' ') && (str[i] != '[=10=]')) {    /*  it bursts vector  */
        printf("%c", str[i]);
        i++;
    }

    return 0;
}

我会把这个留作答案,因为 De Morgan 对此类问题非常有用。使问题更容易在原始代码中看到的有问题的转换是:

(not A) or (not B) == not (A and B)

(str[i] != ' ') || (str[i] != '[=10=]') <equivalent> !(str[i] == ' ' && str[i] == '[=10=]')

因为 (A && B) 永远为假(str[i] 不能既是 space 又是终止符),相反,即 !(A && B) 永远为真,所以while 条件永远不会计算为 false,你会得到无限循环。这在后面的陈述中更容易看出(因此 De Morgan 的用处)。

另请注意,更正后的陈述(请参阅 FaisalM 回答)也可以使用其他 De Morgan 转换进行重组:

(not A) and (not B) == not (A or B)   

(str[i] != ' ') && (str[i] != '[=11=]') <equivalent> !(str[i] == ' ' || str[i] == '[=11=]')

这也使得(至少对我而言)在阅读第二个版本时更容易理解:它是一个 space,或者如果它是一个空终止符,用 ! 使其为假,终止 while 循环。

但是现在您必须评估括号内的完整表达式...这可能会导致一些效率损失,请参阅短路评估...尽管我认为编译器通常会转换回更高效的版本自动。