【问题标题】:How to get 'isalpha' to iterate through each character of string?如何让'isalpha'遍历字符串的每个字符?
【发布时间】:2019-10-14 11:49:44
【问题描述】:

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

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

【问题讨论】:

  • 那是因为您在第一次测试之后从循环内部return。通过或失败,仅此而已。
  • strlen() 必须迭代字符串才能找到结尾,但是无论如何你都要迭代字符串,直接使用字符串终止符来终止循环更简单、更有效:@987654325 @
  • 你可能对cs50 stack exchange site感兴趣。

标签: c cs50 vigenere isalpha


【解决方案1】:

除非值是非字母的,否则不要短路(returning);保存打印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;

【讨论】:

  • 谢谢。我已经切换了打印命令,因为我认为 !isalpha 由于某种原因没有正确执行,并且想试试看。我真正遇到的麻烦是遍历字符串以检查每个字符是否是字母。我认为这就是if(isalpha(keyword[i]) 正在做的事情,但它不起作用。如果它以字母字符开头并以数字字符继续,它仍然是 Success!
  • @alexa:你是说上面的代码仍然有问题吗?如果是这样,我唯一的猜测是使用string,这在C 中没有。将 keyword 声明为 const char * 以保留它 C.
  • 谢谢!是的,那是我的问题。哎呀。我现在知道了。它运行良好。 :)
【解决方案2】:

两个问题

不要总是退出循环

@ShadowRanger

使用无符号字符值

isalpha(int x)unsigned char 范围和 EOF 中为 x 定义。其他负面的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;
}

【讨论】:

  • isalpha(int x)unsigned char 范围和 EOF 中为 x 定义。其他负面的char 值是未定义的行为。 还有一个另一个理由永远不要使用 CS50 的错误 typedef char *string; bodge。
  • @AndrewHenle 是的,CS50 string keyword 似乎延续了不正确的 string 理解,因为 keyword 不是 C 字符串,而是指向(希望)字符串的指针 - 与IDB 符号字符。类型定义指针的更多常见问题。
  • @chux 哦好的,谢谢你的详细解释!这更有意义。现在完美运行。感谢您的帮助和澄清。
最近更新 更多