tags:

views:

565

answers:

6

Is there an easy way to call a C script to see if the user inputs a letter from the English alphabet? I'm thinking something like this:

if (variable == a - z) {printf("You entered a letter! You must enter a number!");} else (//do something}

I want to check to make sure the user does not enter a letter, but enters a number instead. Wondering if there is an easy way to pull every letter without manually typing in each letter of the alphabet :)

+6  A: 
#include <ctype.h>
if (isalpha(variable)) { ... }
Warren Young
+1, but please change `$` to `#` ;-)
Michael Krelin - hacker
Worth noting that `isdigit()` is more useful here.
Michael Krelin - hacker
Awesome. What would it be to check for number and alpha?
Tater
`isalnum()`
Michael Krelin - hacker
what are *, /, -, +, % (math operators) defined as? alpha, numbers, or something else?
Tater
If I check alpha and num, do I include another library?
Tater
Math operators are considered punctuation (checked with the function ispunct()). All of these functions are including within ctype.h as the example shows.
Andrew Song
hmm. how would this look in a case statement?
Tater
You can't call functions as case-checkers in C. You'd have to use if/else if/else to test multiple things at once and have each handled differently.
Warren Young
oh ok, perfect. so if i'm using a switch case but want to check to see if they enter letter/number i'll just put the if/else to check at the top, then put the switch/case underneath.it's finally coming together :)
Tater
+5  A: 

It's best to test for decimal numeric digits themselves instead of letters. isdigit.

#include <ctype.h>

if(isdigit(variable))
{
  //valid input
}
else
{
  //invalid input
}
Brian R. Bondy
A: 

Aside from the isalpha function, you can do it like this:

char vrbl;

if ((vrbl >= 'a' && vrbl <= 'z') || (vrbl >= 'A' && vrbl <= 'Z')) 
{
    printf("You entered a letter! You must enter a number!");
}
bbg
Although this still permits letters outside of the ASCII range to be ignored ...
AlBlue
What do you have against vowels? If you're going to remove the meaning from your variable names, you might as well just go with 'v'.
Ryan Fox
A: 

isalpha() will test one character at a time. If the user input a number like 23A4, then you want to test every letter. You can use this:

bool isNumber(char *input) {
    for (i = 0; input[i] != '\0'; i++)
        if (isalpha(input[i]))
            return false;
    return true;
}

// accept and check
scanf("%s", input);  // where input is a pointer to a char with memory allocated
if (isNumber(input)) {
    number = atoi(input);
    // rest of the code
}

I agree that atoi() is not thread safe and a deprecated function. You can write another simple function in place of that.

Ashwin
A: 
int strOnlyNumbers(char *str)
{
 char current_character;
 /* While current_character isn't null */
 while(current_character = *str)
 {
  if(
     (current_character < '0')
    ||
     (current_character > '9')
    )
  {
   return 0;
  }
  else
  {
   ++str;
  }
 }
 return 1;
}
Foo
A: 

The strto*() library functions come in handy here:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE ...

int main(void)
{
  char buffer[SIZE];
  printf("Gimme an integer value: ");
  fflush(stdout);
  if (fgets(buffer, sizeof buffer, stdin))
  {
    long value;
    char *check;
    /**
     * strtol() scans the string and converts it to the equivalent 
     * integer value.  check will point to the first character
     * in the buffer that isn't part of a valid integer constant;
     * e.g., if you type in "12W", check will point to 'W'.  
     *
     * If check points to something other than whitespace or a 0
     * terminator, then the input string is not a valid integer. 
     */
    value = strtol(buffer, &check, 0);
    if (!isspace(*check) && *check != 0)
    {
      printf("%s is not a valid integer\n", buffer);
    }
  }
  return 0;
}
John Bode