所以我想问用户只输入大写字母,如果他们使用小写字母或任何其他符号或数字,我想问他们新输入。我正在尝试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];
}
}
答案 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)