如何只接受大写字母作为用户输入?

时间:2019-02-06 16:14:39

标签: c++

所以我想问用户只输入大写字母,如果他们使用小写字母或任何其他符号或数字,我想问他们新输入。我正在尝试ASCII,但我认为即时通讯做错了吗?请帮助我

#include <iostream>
#include <string>

using namespace std;



int main (){
  string teams[100] = {};
  int removeLast=0;
  cout << "please enter ONLY capital letters, (TYPE 'done' to exit)\n";
  for (int i=0;i<100;i++){
    cin>> teams[i];
    if (('A'>= teams[i] && 'Z'<= teams[i] )){ //problem is in this line 
      cout << "letter must be capital\n";
      continue;
    }
    removeLast++;
    if (teams[i] == "done") break;
  }
  cout << "this is the result you entered\n";
  for (int m = 0; m < removeLast-1;m++ ){
    cout << teams[m];
  }




}

3 个答案:

答案 0 :(得分:1)

string teams[100] = {};

if (('A'>= teams[i] && 'Z'<= teams[i] )){ //problem is in this line 

问题在于您如何执行与std :: string数据类型的比较。

teams [i]可能等于“ BaNANAS”,您正在将其与单个字符进行比较。对于您描述的检查,您需要遍历整个字符串并检查其是否符合您的条件:

for (char &c: teams[i]) {
  if (c < 'A' || c > 'Z') {
    // There is an error
  }
}
// If it gets here with no error, the input matches your desired criteria

答案 1 :(得分:1)

除了明显无法同时进行比较<= 'A'>= 'Z'的问题外,您在程序中声明的类型还存在一些基本问题。

    string teams[100] = {};

声明一个由 100个字符串组成的数组,而不是一个由100个字符组成的字符串。这在编译器错误中应该很明显,例如

strarr.cpp:15:17: error: no match for ‘operator>=’ (operand types are ‘char’ 
and ‘std::string {aka std::basic_string<char>}’)
        if (('A'>= teams[i] && 'Z'<= teams[i] )){ //problem is in this line

如果您确实打算最多输入100个团队(以"teams"为复数,至少在语言上看来是这样),那么您需要更改比较以比较第一个-每个字符串中的字符,并带有teams[i][0]

此外,您不能使用for循环来自动递增removelast。为什么?如果不是大写字母怎么办? (答案:它存储在string[i]中,并且您还是要递增removelast)。相反,只需使用简单的while循环和一个索引作为计数器,并保护数组边界,只有在团队以大写字母开头(例如, (使用ndx进行索引,并使用isupper()进行大小写检查)

    while (ndx < 100) {         /* loop until max index or done */
        if (!(cin >> teams[ndx])) { /* always validate your input */
            cerr << "input error or user canceled.\n";
            break;
        }
        if (teams[ndx] == "done")   /* check exit condition */
            break;
        else if (isupper (teams[ndx][0])) { /* use isupper() */
            ndx++;  /* only increment if condition satisfied */
        }
        else    /* handle not a captital */
            cout << " error: letter must be capital\n";
    }

现在不清楚您是要强制所有字母为大写字母还是仅第一个字母。如果希望所有字母都大写,则可以简单地包含一个标志,并在输入的所有字符上循环,如果不是所有字符都大写,则将该标志设置为false。例如,您可以这样做:

    while (ndx < 100) {         /* loop until max index or done */
        bool allupper = true;   /* flag indicating all uppercase */
        if (!(cin >> teams[ndx])) { /* always validate your input */
            cerr << "input error or user canceled.\n";
            break;
        }
        if (teams[ndx] == "done")   /* check exit condition */
            break;

        for (auto& c : teams[ndx])  /* simple loop checking each char */
            if (!isupper(c)  )      /* on failed test */
                allupper = false;   /* set flag false */

        if (allupper)   /* validate all uppercase characters */
            ndx++;      /* only increment if condition satisfied */
        else            /* handle not a captital */
            cout << " error: letter must be capital\n";
    }

希望能解决您的问题。另请注意,对于计数而言,通常优先使用size_t类型而不是int(您将没有负索引)。一个检查所有字符是否大写的代码的工作示例为:

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

using namespace std;

int main (void) {

    string teams[100] = {};
    size_t ndx = 0;

    cout << "please enter ONLY capital letters, (TYPE 'done' to exit)\n";

    while (ndx < 100) {         /* loop until max index or done */
        bool allupper = true;   /* flag indicating all uppercase */
        if (!(cin >> teams[ndx])) { /* always validate your input */
            cerr << "input error or user canceled.\n";
            break;
        }
        if (teams[ndx] == "done")   /* check exit condition */
            break;

        for (auto& c : teams[ndx])  /* simple loop checking each char */
            if (!isupper(c)  )      /* on failed test */
                allupper = false;   /* set flag false */

        if (allupper)   /* validate all uppercase characters */
            ndx++;      /* only increment if condition satisfied */
        else            /* handle not a captital */
            cout << " error: letter must be capital\n";
    }

    cout << "this is the result you entered\n";
    for (size_t m = 0; m < ndx; m++) {
        cout << teams[m] << '\n';
    }
}

注意:尽管使用string数组是完全可以的,但您通常希望使用一个容器,例如{{1的vector }},例如string,以便让容器根据需要管理您拥有的字符串数,并消除执行数组边界的责任)

使用/输出示例

vector<string>

例如,仅检查第一个字符的示例,只需替换上面的代码的第一块即可。如果您还有其他问题,请告诉我。

答案 2 :(得分:1)

重塑车轮永远不是一个好的解决方案。看看这个:

https://en.cppreference.com/w/cpp/string/byte/isupper

是的,还有一个问题是您使用了100个字符串。