如何在 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
循环永远不会中断。如果您想在 space
或 end-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 循环。
但是现在您必须评估括号内的完整表达式...这可能会导致一些效率损失,请参阅短路评估...尽管我认为编译器通常会转换回更高效的版本自动。
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
循环永远不会中断。如果您想在 space
或 end-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 循环。
但是现在您必须评估括号内的完整表达式...这可能会导致一些效率损失,请参阅短路评估...尽管我认为编译器通常会转换回更高效的版本自动。