为什么isalpha()在空格处停止?

时间:2015-01-24 19:03:14

标签: c++ arrays char

int main(){
char check[256], c;
int ch=0;
cin >> check;
while (check[ch]){
    c = check[ch];
    if (isalpha(c))putchar(c);
    ch++;
}
}

如果例如check[256]是“this and this”,程序将仅打印“this”,这意味着它在第一个空格停止,第一个问题是为什么,第二个是有办法阻止它它会打印“this and this”还是“thisandthis”?

3 个答案:

答案 0 :(得分:4)

如果您构建了一个简短的示例,请执行以下操作:

#include <stdio.h>
#include <ctype.h>

int main()
{
    char check[256] = "this and this"; 

    int ch = 0;

    while (check[ch]) 
    {
        char c = check[ch];
        if (isalpha(c)) putchar(c);
        ch++;
    }

    return 0;
}

您会注意到这完全符合您的要求。所以罪魁祸首是这一行:

cin >> check;

如果您想阅读一行,请使用getline:

std::getline(std::cin, check);

你应该真的在使用

#include <iostream>
#include <string>

并停止使用char数组。您使用的是C ++,而不是C。

答案 1 :(得分:2)

在这一行:

cin >> check;

只有第一个单词会被读入char数组,因为这是cin的默认行为。请验证该数组是否包含整个字符串。

答案 2 :(得分:0)

我很惊讶没有人反对这一点。无论如何不要使用char数组std::cin。您是否考虑过如果某个用户输入的字数超过缓冲区的长度,可能会发生什么?

当然,您可以使用std::string,当然,您可以使用std::getline(std::cin, s)来读取一行。

示例:

#include <iostream>
#include <string>
#include <cctype>

int main() {
    std::string s;
    if (std::getline(std::cin, s))
        for (char c : s)
            if (std::isalpha(c))
                std::cout << c;
    std::cout << "\n";
}

输出:

$ g++ test.cc -std=c++11 && echo "Hello World" | ./a.out
HelloWorld