【问题标题】:Why does isalpha() stop at spaces?为什么 isalpha() 在空格处停止?
【发布时间】:2015-01-24 19:03:14
【问题描述】:
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”?

【问题讨论】:

  • 请阅读this。我的猜测是您的输入例程没有按照您的想法执行。
  • 个错误。而且您等待找到它们的时间越长,您的程序产生垃圾的时间就越长。发布重现您的问题所需的最短代码。注意:当我将最短的代码粘贴到编译器中时,它应该编译!。这意味着应该有一个main
  • 简而言之:尝试编写一个读取整行用户输入的程序。
  • cin >> string_variable 是格式化输入,忽略空格的前导和停止
  • 有没有办法让 cin >> string_variable 不停止在空格或任何其他可以工作的函数?

标签: c++ arrays char


【解决方案1】:

如果您构建了一个简短的示例,如下所示:

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

【讨论】:

    【解决方案2】:

    在这一行:

    cin >> check;
    

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

    【讨论】:

      【解决方案3】:

      我很惊讶没有人反对这一点。绝对不要使用带有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
      

      【讨论】:

        猜你喜欢
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        相关资源
        最近更新 更多