【问题标题】:c++ input character or check length of string is 1?c ++输入字符或检查字符串的长度是否为1?
【发布时间】:2016-11-05 00:10:49
【问题描述】:

所以我最初使用 cin 让用户输入一个字符。然后,如果这个字符不是 a、b 或 c,它会继续循环并打印一条错误消息。但是,如果用户输入多个字符,则会多次打印错误消息。所以现在我正在使用 scanf 接收一个字符串并检查长度是否为 1。这完全不工作。

string enterLetter() {
    string n;
    scanf("%s", &n);
    return n;

}


void main() {
    string ch = "";
    cout << "Type a, b, or c: ";


    while (ch != "a" && ch != "b" && ch != "c"){
        while (ch.length() != 1) {
            ch = enterLetter();
            cout << ch.length();
        }
        ch = tolower((char)ch.c_str());
        cout << "\n" << ch;


    }

【问题讨论】:

  • 你为什么要使用字符串呢?使用char
  • 还有,为什么你的主要方法是void类型的?
  • scanf 与 c 风格的字符串一起使用,而不是 std::string 的。
  • 为什么 main 不是 void?我以前有 cin 和 char enterLetter() 方法,但是输入多个字符会循环遍历所有字符并多次打印错误消息。同样,输入“fdsa”之类的字符作为字符会在到达“a”时跳出while循环,并执行与用户键入“a”而不是“fdsa”相同的操作。我不想那样。
  • main 应该有一个int 类型的签名。这是语言规范的一部分。这是 C++,不是 Java。

标签: c++ string character


【解决方案1】:

您不能像您尝试的那样将scanf("%s")std::string 一起使用。 scanf("%s") 需要预先分配的 char[] 代替。如果您想阅读std::string,请改用std::cin.operator&gt;&gt;()std::getline()

char enterLetter() {
    string n;
    do {
        std::getline(std::cin, n);
    }
    while (n.length() != 1);
    return n[0];
}

int main() {
    char ch;
    do {
        std::cout << "Type a, b, or c: ";
        ch = enterLetter();
    }
    while ((ch != 'a') && (ch != 'b') && (ch != 'c'));

    std::cout << ch;

    return 0;
}

【讨论】:

    【解决方案2】:

    您不需要,也不应该为此使用string。使用 charscanf 效果更好。

    int main() {
      char ch;
      cout << "Type a, b, or c: ";
      scanf("%c", &ch);
    
      while ((ch > 'C' && ch < 'a') || ch > 'c' || ch < 'A' ) {
        if (ch >= 'A' && ch <= 'Z')
          ch += ('a' - 'A');
        cout << endl << ch;
        cout << endl << "Enter a, b, or c: ";
        scanf("%c", &ch);
      }
    }
    

    这使用scanf 来获得char ch。它在 char 不是 a, b, cA, B, C 时循环(因为您似乎想要一个大写的用例)。如果char 是大写的,它会被转换为小写,然后输出char

    【讨论】:

    • scanf() 用于 C。std::cinstd::coutstd::string 等用于 C++。您真的不应该将 C 和 C++ 混合在一起。 std::cin 适用于单char 输入,使用std::cin &gt;&gt; chstd::cin.get()
    • 我只是建议scanf。我自己不会使用它,但它在原始问题中。
    • 为什么不混合它们呢? scanf 在这里提到 cplusplus.com/reference/cstdio/scanf 所以它在 c++ 中也不能工作吗?
    • cstdio 标头中的函数只是包装在 C++ 中 std 命名空间中的 C 函数。
    • 它有效,但通常有一些缺点。例如,您可以调用scanf("%c", &amp;I_am_not_a_char); 并在运行时导致非常糟糕的事情发生,因为编译器无法告诉scanf 的变量参数应该是什么(没有帮助)。 cin &gt;&gt; I_am_not_a_char 不受程序破坏影响。此外,有时将 C++ 风格的流与 stdio 同步会出现性能问题。
    【解决方案3】:

    您可以使用cin.getline() 读取由 Enter 键终止的整行用户输入。

    char str[64];
    cin.getline(str, sizeof(str));
    

    如果strlen(str) 不等于 1,则会引发错误。否则,str[0] 可以与abc 进行比较。

    如果您在循环中scanfa 字符串,它将返回以空格结尾的第一组字符(空格键或换行符)。在下一次迭代中,它将读取下一个字符串,依此类推。如果用户输入类似"abc def\n" 的内容,scanf 将首先返回abc,然后是def。如果使用 cin.getline(),则在换行之前输入的所有字符,即"abc def",将在第一次调用 cin.getline() 时返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多