如何允许用户输入带空格的字母(例如John Mike),但不允许用户输入带数字值的字母?

时间:2017-11-03 13:05:28

标签: c programming-languages

我想创建一个简单的 C程序,以允许用户输入他们的名字并打印出他们的名字(例如John Mike)。但我也希望程序禁止用户在名称中键入数字值(例如John34 Mike)。

我知道如何使用scanf("%[^\n]",&name);,但该用户可以意外在输入名称中输入数字。 我想禁止用户输入带数字值的字母。 有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

  

如何允许用户输入带空格的字母(例如John Mike),但不允许用户输入带数字值的字母?

将输入的整个读入字符串,然后处理字符串。

评估字符串中的合法字符和模式。

重要的是慷慨有效并考虑各种文化问题。名称有效性测试是一个敏感问题。很容易negative feed试图讨论它。也可以考虑not constructive

使用isalpha()进行第一级检查,然后检查确保至少一个alpha的其他有效字符。

isalpha() locale敏感,并提供一些级别的国际化。

#include <ctype.h>
#include <stdbool.h>
bool name_test1(const char *s) {
  const char *between_char = "-'";  // Allow O'Doul, Flo-Jo.  Adjust as needed
  bool valid = false;
  while (*s) {
    if (isalpha((unsigned char ) *s)) {
      valid = true;
    } else if (*s == ' ' && valid) { // or  isspace((unsigned char) *s) for any white-space
      valid = false; // valid char must follow
    } else if (strchr(between_char, *s) != NULL && valid) {
      valid = false; // valid char must follow
    } else {
      return false;
    }
    s++;
  }
  return valid;
}

&& valid中的*s == ' ' && valid可确保领先的空间无效。

示例:

void ntest(const char *s) {
  printf("%d <%s>\n", name_test1(s), s);
}

int main(void) {
  ntest("John Mike");
  ntest("John34 Mike");
  ntest("John Mike ");
  ntest(" John Mike");
  ntest("Flo-Jo");
  ntest("O'Doul");

  char name[100];
  while (fgets(name, sizeof name, stdin)) {
    name[strcspn(name, "\n")] = '\0';  // lop off potential trailing \n
    if (name_test1(name)) puts("Acceptable name");
    else puts("Unacceptable name");
  }
}

1 <John Mike>
0 <John34 Mike>
0 <John Mike >
0 < John Mike>
1 <Flo-Jo>
1 <O'Doul>
...

最好使用scanf("%[^\n]",&name);它有问题:它读取几乎一行,'\n'未被读取。仅"\n"一行是个问题。它无法防止过度运行缓冲区。

答案 1 :(得分:-1)

使用getline功能获取输入。然后使用isdigit函数检查字符串以允许或禁止输入字符串。

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

int main(int argc, char *argv[])
       {
           FILE *stream;
           char *line = NULL;
           size_t len = 80;
           ssize_t nread;



           nread = getline(&line, &len, stdin);
           printf("Retrieved line %s", line);
       for(int i=0;line[i]!='\0';i++)
        if(isdigit(line[i])){
            printf("Disallow\n");
                return 0;}
       printf("Allow\n");
       return 0;    

       }