如何使“ isalpha”遍历字符串的每个字符?

时间:2019-05-28 22:32:31

标签: c cs50 vigenere isalpha

我在弄清楚如何检查关键字(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;
    }
}

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

2 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:1)

两个问题

不要总是退出循环

@ShadowRanger

使用无符号字符值

isalpha(int x)范围和EOF中为x定义了

unsigned char。其他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;
}