0

我尝试使用,

if(isalpha(card[i].name))
...

但它说我不能将它与 char 类型一起使用这是我的代码: 这是结构:

struct firm {
unsigned egn;
char name[80];
char lastname[80];
char department[80];
unsigned salary;
}card[100];

这是我要检查是否只有字母然后继续的功能:

void enter()
{
int i, n;
char temp[80];
do{
    cout<<"Enter how many workers you want to add: ";cin>>n;
}while(!(n>0 && n<101));
for(i=top;i<n;i++)
{/*ЕГН + проверка*/
    cout<<"Enter EGN: ";do{
    cin>>temp;
if((strlen(temp)!=10))
    cout<<"Enter EGN: ";
}while(strlen(temp)!=10);
card[i].egn = (unsigned) atoi (temp);
/*Име Фамилия*/
cout<<"Enter name(only letters): ";cin>>card[i].name;
cout<<"Enter lastname(only letters): ";cin>>card[i].lastname;
cout<<"Enter department: ";cin>>card[i].department;
cout<<"Enter salary: ";cin>>temp;
card[i].salary = (unsigned) atoi (temp);
}
}

当我尝试使用这种代码时:

cout<<"Enter name(only letters): ";do{
cin>>card[i].name;
if(isalpha(card[i].name))
.....;

它说我不能在 int 中使用 char (isalpha 使用 int?)

4

3 回答 3

2

您需要遍历字符串的每个字符,isalpha()只测试一个字符。

于 2012-12-03T11:20:43.743 回答
1

您不能isalpha在整个char数组上使用,只能在单个字符上使用。要检查char数组中的每个字符是否按字母顺序排列,您可以使用以下std::all_of算法:

auto name_begin = std::begin(card[i].name);
auto name_end = std::end(card[i].name);
bool name_alpha = std::all_of(name_begin, std::find(name_begin, name_end, '\0'), std::isalpha);
if (name_alpha) {
  std::cout << "It's alphabetical!" << std::endl;
}

如果您使用的编译器没有必要的 C++11 支持,您可以执行以下操作:

char* name_begin = card[i].name;
bool name_alpha = std::all_of(name_begin, name_begin+std::strlen(name_begin), std::isalpha);
if (name_alpha) {
  std::cout << "It's alphabetical!" << std::endl;
}

然后是不使用标准库算法的无聊方式:

bool name_alpha = true;
for (char* character = card[i].name; *character != '\0'; character++) {
  if (!std::isalpha(*character)) {
    name_alpha = false;
    break;
  }
}
if (name_alpha) {
  std::cout << "It's alphabetical!" << std::endl;
}
于 2012-12-03T11:34:17.133 回答
0

问题是 name 本身就是一个字符数组,所以你需要像这样测试每个元素:

.....
cout<<"Enter name(only letters): ";do{
cin>>card[i].name;
bool bIsAlpha = true;
for (int j = 0; j < strlen(card[i].name); ++j)
{
  if(!isalpha(card[i].name[j]))
  {
    bIsAlpha = false;
    break;
  }
}
if (bIsAlpha)
{
  .....;
}
于 2012-12-03T11:29:17.797 回答