Michi
Michi

Reputation: 5297

Function to check for alphabetic characters

I created a Function to check if user typed a Real Name excluding all other non alphabetic characters. Well, from my side, as a beginer in C language its works fine. Anyway i have just a small problem, with the string name, if there is space inside that string i get wrong Name, but if there is only one name (michi) everything is ok.

        #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;
    }

My questions are: 1) Did i found a right way of checking if string contains only non alphabetic characters. 2) How can i extend my Function to skip spaces

Upvotes: 1

Views: 15509

Answers (5)

Amit
Amit

Reputation: 46323

If you have a valid set, test against this set, not other sets that might or might not be the complement set (So many sets in one sentence :-):

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

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

   if (!valid) {
      return 0; // or any value you prefer to indicate "not valid"
   }
}

Upvotes: 4

Daniel Jour
Daniel Jour

Reputation: 16156

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

Looking at the code below that statement, you're lying. What your code does is checking whether there is a character 0 or any character below 9 in the string. Better do what you're saying:

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

As you see I added the space to the set of allowed characters. To get rid of the if branch just negate the whole test expression (either by hand or using the not operator !).

The comparisons are working this way because of the layout of the ASCII table.

Note that there's a library function for this: isalpha

Upvotes: 4

moffeltje
moffeltje

Reputation: 4658

You can just continue the loop if the character is a space:

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

Furthermore, you could also make sure it does not contain any other character than just alphabetic, by checking if all character are not outside the range of accepted characters:

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

Note: the ASCII table is a nice "tool" to confirm the range you have to check.

Upvotes: 1

CS Pei
CS Pei

Reputation: 11047

If you want to check only alphabetic chars and space, you can use isapha and isspace from ctype.h. These functions return non-zero for ture and zero for false.

Upvotes: 2

Trent Small
Trent Small

Reputation: 1263

Take a look at isalpha in ctype.h. This returns true if a char is a letter, just like what you want.

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

By the way, if you're checking ASCII encodings, your function fails for characters such as '(' or '~'.

Upvotes: 5

Related Questions