在编写非常简单的程序来删除空格,制表符,换行符的过程中,我遇到了一些我实际上没有抓到的东西;即使 if 条件为真,只有当tab,space或换行不存在时,仍然会因为某些原因执行上面提到的..这里是代码
#include <cstdio>#include <cstring>
#include <stdio.h>
#include <string.h>
#define LGT 100
void rem(char s[])
{
int i;
for(i=(strlen(s)-1);i>=0;i--)
if(s[i]!=' ' || s[i]!='\t' || s[i]!='\n')
break;
s[i+1]='\0';
}
int main(void)
{
char v[LGT]={"sdsfg\t"};
rem(v);
printf("%s\n",v);
getchar();
}
答案 0 :(得分:9)
s[i]!=' ' || s[i]!='\t' || s[i]!='\n'
始终为真。字符不能等于空格,制表符和换行符。
答案 1 :(得分:6)
问题在于
if(s[i]!=' ' || s[i]!='\t' || s[i]!='\n')
总是如此。如果s[i]
是空格,则后两个检查为真。如果它不是空格,那么第一次检查就是真的。
要解决此问题,请将这些更改为ands:
if(s[i]!=' ' && s[i]!='\t' && s[i]!='\n')
或者,更好的是,使用isspace
:
if(isspace(s[i])
答案 2 :(得分:2)
s[i] != x || s[i] != y
适用于x
和y
的所有不同值。
您可能想要&&
。
答案 3 :(得分:2)
如果你仔细想想,任何像下面这样的表达都是可疑的......
a != x || a != y
无论a
是什么,它始终不是一件事,也不是另一件事。所以这总是如此。与and
相同的错误总是错误而不是总是如此,它看起来像:
a == x && a == y
有点容易看到,对吗?事情a
不可能同时是x
和y
。事实上,这些陈述与De Morgan's laws.
更新:所以,通常你想要的是a != x && a != y
。对于第二种情况:a == x || a == y
。
答案 4 :(得分:0)
尝试更改
if(s[i]!=' ' || s[i]!='\t' || s[i]!='\n')
break;
与
if(s[i]!=' ' && s[i]!='\t' && s[i]!='\n')
break;
答案 5 :(得分:0)
正如其他人已经指出的那样,你的布尔表达式是一个重言式(即总是如此)。您可能还希望使用函数strpbrk()
而不是复制标准库提供的功能:
#include <stdio.h>
#include <string.h>
// …
char text[] = "foo\tbar\n";
char *tail = strpbrk(text, " \t\n");
if(tail) *tail = 0;
printf("<%s>", text); // prints <foo>
<德尔>
此外,在包含<c…>
标头时,您应在标识符前加std::
或添加using
指令。或者,请改用<….h>
。
使用不是从C标准库继承的功能,更多惯用的C ++代码如下所示:
德尔>
#include <iostream> #include <string> // … std::string text = "foo\tbar\n"; std::size_t pos = text.find_first_of(" \t\n"); if(pos != std::string::npos) text.erase(pos); std::cout << '<' << text << '>'; // prints <foo>