1

我无法弄清楚如何检查关键字(argv [1])中的每个字符。我知道我可能遗漏了一些非常明显的东西。:(

我尝试将字符串保存到数组中,声明一个新的 int,但仍然是同样的问题。

//check to make sure 2nd argument is fully alphabetic
string keyword = argv[1];

for(int i = 0, n = strlen(keyword); i < n; i++)
{
    if(isalpha(keyword[i]))
    {
        printf("Success! \n");
        return 0;
    }
    else
    {
        printf("Invalid key, must be fully alphabetic. \n");
        return 1;
    }
}

预期输出应为“无效键,必须完全按字母顺序排列”。对于任何不完全按字母顺序排列的东西。相反,它仅适用于开头字符,而不适用于整个关键字。

4

2 回答 2

2

return除非值是非字母顺序的,否则不要短路(通过ing);保存打印Success0在整个循环完成但由于非字母字符而没有退出时返回:

for(int i = 0, n = strlen(keyword); i < n; i++)
{
    if(!isalpha(keyword[i]))
    {
        printf("Invalid key, must be fully alphabetic. \n");
        return 1;
    }
}
printf("Success! \n");
return 0;
于 2019-05-28T22:35:19.067 回答
1

两个问题

不要总是退出循环

@ShadowRanger

使用无符号字符值

isalpha(int x)xunsigned char范围和 EOF中定义。其他负值char是未定义的行为。

// if(!isalpha(keyword[i]))
if(!isalpha((unsigned char) keyword[i]))

使用简化的循环 -strlen()不需要。

int alexa_alpha_test(const char *keyword) {
  while (*keyword) {
    if(!isalpha((unsigned char) *keyword)) {
      printf("Invalid key, must be fully alphabetic. \n");
      return 1;
    }
    keyword++; 
  }
  printf("Success! \n");
  return 0;
}
于 2019-05-29T11:35:38.267 回答