C模糊问题

时间:2011-01-27 20:11:21

标签: c

在编写非常简单的程序来删除空格,制表符,换行符的过程中,我遇到了一些我实际上没有抓到的东西;即使 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();
}

6 个答案:

答案 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适用于xy的所有不同值。

您可能想要&&

答案 3 :(得分:2)

如果你仔细想想,任何像下面这样的表达都是可疑的......

a != x || a != y

无论a是什么,它始终不是一件事,也不是另一件事。所以这总是如此。与and相同的错误总是错误而不是总是如此,它看起来像:

a == x && a == y

有点容易看到,对吗?事情a不可能同时是xy。事实上,这些陈述与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>