为什么不是isalpha工作?

时间:2015-07-25 23:07:00

标签: c cs50

我正在使用C,我需要检查用户输入的第二个命令行参数argv [1]是否仅由字母表中的字母组成,如果没有,则执行else循环中的操作。我使用的是alpha函数但是当我编译并运行程序时,无论我的第二个命令行参数是什么(按字母顺序或其他方式),它总是执行“else循环”。我该如何解决这个问题?

#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
  int a  = argc;    

  if (a != 2)
  {
    return 1;    
  }

  string b = argv [1]; 
  int c = strlen(b);
  string m;

  for (int i = 0; i < c; i++)
  {
    if (isalpha(b[c]))
    { 
      m = GetString();    
    }
    else
    {
      printf("Please provide a valid keyword\n");
      return 1;
    }         
  }
}  

2 个答案:

答案 0 :(得分:10)

尝试替换

if (isalpha(b[c]))

if (isalpha(b[i]))

目前,您正在检查索引处的元素,该元素是循环每次迭代时strlen(b)的结果。因为基于C b[strlen(b)]的数组索引为零,所以引用'\0',空终止符。

参考下面的Keith Thompson评论和this question的答案,您实际上应该将传递给isalpha的值转换为unsigned char,以确保不会调用未定义的行为。

因此,您应该将代码更改为

if (isalpha((unsigned char)b[i]))

确保没有UB

答案 1 :(得分:0)

使用isalpha(b[i])代替isalpha(b[c]) 像这样:

if (isalpha(b[i]))
{ 
  m = GetString();    
}