2012-01-23 27 views
4

我想弄清楚如何使用这个功能。我在网上发现它,显然它会检查你的字符串是否有空格。所以它不适合我。我发现我甚至没有进入我需要的if语句。如何在C++中使用isspace函数?

for (i=0;i < marks.length();i++) 
{ 
    if (isdigit(marks[i])) 
    { 
     floatMARK = 1; 
    } 
    else 
    { 
     charMARK = 1; 
    } 
} 

if (floatMARK == 1) 
{ 
    printf("were in."); 
    for (i=0;i < marks.length();i++) 
    { 
     if (isspace(marks[i])) 
     { 
      multiMARK = 1; 
      printf("WE HAVE A SPACE!!"); 
     } 
    } 

} 

任何人都知道我在做什么错了?如果你需要我澄清任何事情,请告诉我。

+0

我的错误之上。非常感谢,因为我没有明显的哈哈。 – Robolisk

+0

我不明白我为什么有-2? 我做了什么错D:? – Robolisk

+2

¤只要你对英文字母表有限制(如果你是),我什么都看不到*技术上*错误。但是,使用整数作为布尔标志,而不是仅使用C++'bool'变量,例如使用'printf'而不是C++ iostreams(在初学者的程序中),似乎表明你有第一次学习C的负担。如果是这样,那么你需要专注于解除C和学习C++,这是一个*不同的语言*。哦,顺便说一下,是否可以用没有数字的输入测试代码?然后空间不会被检测到。干杯&hth。, –

回答

12

只需测试一个字符串是否有空格就行了。这就是你需要:

#include <ctype.h> 

bool hasspace = std::find_if(str.begin(), str.end(), ::isspace) != str.end(); 

::是范围解析操作指定isspace是一个全球性的功能,而不是类似命名的std::isspacefind_if里面std::功能。如果你使用using namespace std;,那么你不需要std::,但你仍然需要简单的::

find_if函数将一个迭代器带到字符串的开头,一个迭代器到字符串的末尾,一个函数接受一个参数并返回一些可转换为bool的值。 find_if从第一个迭代器迭代到第二个迭代器,将当前项的每个值传递给您提供的函数,并且如果函数返回true,find_if返回导致函数返回true的迭代器。如果find_if完成并且函数永不返回true,那么它会将迭代器返回到范围的末尾,在这种情况下为str.end()

这意味着,如果find_if回报str.end(),它得到的字符串的结尾没有isspace回到true,这意味着有字符串中没有空格字符。因此,您可以针对str.end()测试find_if的结果;如果它们不相等(!=),则表示字符串中有空格,并且hasspacetrue。否则,hasspacefalse

+0

现在看到了,你告诉我的是复杂的方式,你刚才给我看到的是“更容易”,看起来更加复杂,我甚至都不明白发生了什么,首先,“::”第二,我不明白“std :: string :: npos;”在做什么,或者他们在做什么(考虑到我不知道是什么) – Robolisk

+0

@MichaelGoldshteyn谢谢你的提醒,那个人总是会迷惑我 –

+0

@KerrekSB是的,这就是我的意思,修正 –

0

这里是另一种方式,如果上面的版本似乎很奇怪,或者是你的知识

if(marks[i] == ' ') { 
cout<<"Space found!"; 
} 
+5

这不等于。 'isspace()'检查它的参数是否是任何空格字符;其中包括空格字符以及“\ f'','\ n'',''\ r'',''\ t''和''\ v''(可能还有其他字符,具体取决于区域设置)。 –