2017-05-23 42 views
0

下面的代码(编译得很好)检查命令行输入中的非字母字符,但是我觉得有必要有更好的方式来编写它。例如,您可以看到没有在核心if语句中执行的代码,该语句检查字符串中的每个字符。有没有办法检查一个字符是否是而不是一个字母字符并抛出错误,而不是在else函数中有错误?如何检查C中字符串中的非字母字符C

int main(int argc, string argv[]){ 

    // terminate program if more than one key 
    if(argc != 2){ 

     printf("error"); 
     return 1; 

    // check to ensure key characters are alphabetical 
    } else { 
     for(int h = 0; h < strlen(argv[1]); h++){ 
      if(isalpha(argv[1][h])){ 

      } else { 
       printf("error"); 
       return 1; 
      } 
     } 
    } 
} 
+2

你熟悉的'!'运营商的功能? –

+0

为什么不只是'如果(!isalpha(argv [1] [h]))',还是我错过了什么?顺便说一句,'string argv []'中的**'string' **是什么? –

+0

@ KenY-N应该是'char *'?在那种情况下,我应该如何迭代'char *'数组来检查每个字母是否是按字母顺序排列的?如果(!isalpha(argv [1] [h]))printf(“error”);如果(int h = 0; h zangiku

回答

1

字符串通常很短,但调用strlen()ina for循环条件是一个坏习惯。它是O(N平方),因为整个字符串在每次迭代时被扫描。

这样写

int allalpha(const char *str) 
{ 
    size_t i; 
    for(i=0;str[i];i++) 
    if(!isalpha(str[i])) 
     return 0; 
    return 1; 
} 

然后在主

if(!allalpha(argv[1])) 
{ 
    /* non all-alpha error handling code here */ 
} 
1

是的,你可以反转if条件,这是在这些情况下的一般解决方案。

int main(int argc, string argv[]){ 

    // terminate program if more than one key 
    if(argc != 2){ 

     printf("error"); 
     return 1; 

    } else { 
     // check to ensure key characters are alphabetical 
     for(int h = 0; h < strlen(argv[1]); h++){ 
      if(!isalpha(argv[1][h])){ 
       printf("error"); 
       return 1; 
      } 
     } 
    } 
} 
+0

“!”运算符是一个布尔一元运算符,它将采用任何布尔条件并反转其值。现在,在C语言中,布尔实际上只是整数,所以在实践中,对于非零输入(* true *)和对于零输入(* false *)将产生0(* false *), )。 – Midgard

+0

另请参阅https://stackoverflow.com/questions/1921539/using-boolean-values-in-c。 – Midgard

相关问题