为什么 isalpha() 停在空格处

Why does isalpha() stop at spaces?

本文关键字:空格 isalpha 为什么      更新时间:2023-10-16
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]是"这个和这个",程序只会打印"这个",这意味着在第一个空格它停止,第一个问题是为什么,其次有没有办法停止它,所以它会打印"这个和这个"或"这个和这个"?

如果你构建了一个简短的例子,像这样:

#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>

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

在这一行中:

cin >> check;

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

我很

惊讶还没有人反对这一点。无论如何,不要使用带有 std::cin 的普通char数组。您是否考虑过如果某些用户输入的单词比缓冲区大小长,会发生什么情况?

当然,你会改用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