2015-06-23 81 views
0

我创建了一个函数来检查用户是否键入了一个不包含所有其他非字母字符的实名。 那么,从我身边,作为一个C语言的开始,它的工作很好。 无论如何,我只是一个小问题,与字符串的名称,如果有字符串中的空间我得到错误的名称,但如果只有一个名称(michi)一切都好。检查字母字符的函数

 #include <stdio.h> 
    #include<string.h> 

     /* Here is the Function which check if the string contains only: */ 
     /* abcdefghijklmnopqrstuvwxyz and ABCDEFGHIJKLMNOPQRSTUVWXYZ */ 
    int checkName(char *s){ 
     int i,length; 
     length = (strlen(s)); 

     for (i=0;i<length;i++){ 
      if(s[i] == '0' || s[i] <= '9'){ 
       return 1; 
      } 
     } 
     return 0; 
    } 

    int main(){ 
     char name[]= "Michi"; 
     int check; 

     if((check = checkName(name)) == 0){ 
      printf("\n\n\t\t\tYour name is:\t%s\n\n",name); 
     }else{ 
      printf("\n\n\t\t\tWrong name:\t%s\n\n",name); 
     } 

     return 0; 
    } 

我的问题是: 1) 我才发现检查,如果字符串中包含唯一的非英文字母的正确方法。 2) 如何延长我的职责,跳过空格

+2

如果你的名字是“奥布莱恩”或“史密斯 - 巴恩斯”,我怀疑一个人会说“不包括所有其他非字母字符真实姓名”。 – chux

+0

我改变了标题名称。 – Michi

+0

正在寻找任何字符的for循环0 ... 9不是您说的代码所要做的。代码需要一个积极的检查。 I.E.对于每个字符if('a'<= str [i] &&'z'> = str [i])|| ('A'<= str [i] &&'Z'> = str [i])然后不做任何其他错误返回 – user3629249

回答

1

您只需继续循环,如果该字符是一个空格:

for (i=0;i<length;i++){ 
    if(s[i] == ' '){ 
     continue; 
    } 
    else if(s[i] == '0' || s[i] <= '9'){ 
     return 1; 
    } 
} 

此外,你也可以确保它不包含任何其他人物不仅仅是字母,通过如果所有字符都不在外面接受的字符范围检查:

for (i=0;i<length;i++){ 
    if((s[i] < 'A') || (s[i] > 'Z' && s[i] < 'a') || (s[i] > 'z')){ 
     return 1; 
    } 
} 

注:ASCII table是一个很好的“工具”来确认你必须检查的范围。

+0

我不知道那个“工具”。 – Michi

+0

@Michi就像你在ASCII表格中看到的那样,字符“A”等于数字65,所以你也可以写:'(s [i] <65)'而不是'(s [i] < 'A')'。 – moffeltje

3

如果你有一组有效的,针对这组测试中,没有其它集合可能会或可能不会被一个完成设置为全局组(那么多套一句话:-):

for (i=0;i<length;i++){ 
    int valid = false; 

    valid |= s[i] >= 'a' && s[i] <= 'z'); 
    valid |= s[i] >= 'A' && s[i] <= 'Z'); 
    valid |= s[i] == ' '; 

    if(!valid) { 
     return 1; 
    } 
} 
+0

我不知道布尔做了什么,但我得到的错误: 错误:unknown type name'bool'| – Michi

+0

你是对的!我正在考虑用其他语言......改变... – Amit

+0

我在今年开始时就开始学习C语言,并且喜欢它。 – Michi

3

看看ctype.h中的isalpha。如果char是字母,则返回true,就像您想要的一样。

http://www.cplusplus.com/reference/cctype/isalpha/

顺便说一句,如果你检查ASCII编码,你的功能字符,例如如果你想只检查字母字符和空格失败“(”或“〜”。

+0

嗯,它将使'9'下的所有字符无效。在'9'之前是否有'('和'〜')的编码? –

+0

你是对的 - 我的不好。 – chux

1

,你可以使用从ctype.hisaphaisspace。这些功能ture和零返回非零false

3

Here is the Function which check if the string contains only: abcdefghijklmnopqrstuvwxyz and ABCDEFGHIJKLMNOPQRSTUVWXYZ

望着低于ST代码你在撒谎。你的代码的作用是检查字符串中是否有字符09以下的任何字符。更好地按照你所说的去做:

if((str[i] >= 'a' && str[i] <= 'z') || 
    (str[i] >= 'A' && str[i] <= 'Z') || 
    (str[i] == ' ')) { 
    // fine .. 
} 
else { 
    // not fine! 
} 

正如你所看到的,我在允许的字符集中添加了空格。为了摆脱if分支只是否定了整个测试表达式(手动或使用not运算符!)。

由于ASCII表格的布局,比较正在以这种方式工作。

注意,存在该库函数:isalpha

+1

我知道那个函数,但是我想学习C,我的意思是写我自己的函数。它可以帮助我更快地学习,我希望能够更快地学习 – Michi

+0

我认为这是一种很好的学习方式,重要的是你的代码能够完成你所说的内容,好的和正确的代码几乎总是可以像描述它正在做什么的句子一样被读取。 –

+0

你的代码“(s [i] =='')”... 我得到“错误的名字” – Michi