【问题标题】:Only string between 5 and 10 characters inputted? C Programming只输入了 5 到 10 个字符之间的字符串? C 编程
【发布时间】:2018-02-15 13:43:13
【问题描述】:

所以我的程序需要包括它强制用户输入一个 5-10 个字符之间的字符串,并进行验证,以确保长度正确,到目前为止我有这个但完全卡住了,关于如何验证的任何建议数据类型是否只允许输入字符串?

char x[10];
int length, i;

for(i=0;i=10;i=i+1){
    printf("Please enter 5-10 Characters\n");
    scanf("%s", &x);

    length = strlen(x);
    if (length < 5){
        printf("Not Long Enough!\n");
    }
    if (length > 10){
        printf("Too Long!\n");
    } 
    while('x' == 'char'){
        if (scanf("%s", &x) == 1){
            return 0;
        }else{
            printf("Not a string, Try again");
            gets(x);
        }

    }
    printf("You inputted: %s\n", x);
}

【问题讨论】:

  • 查看第一行char x[10];,数组不够大,无法容纳长度为10字符串。查看第一个循环for(i=0;i=10;i=i+1),如果您仔细阅读,这不会做任何明智的事情。 scanf("%s", &amp;x); 行不会防止缓冲区溢出,应该是x 而不是&amp;x,并且没有检查函数是否成功。再往下while('x' == 'char') 一点意义都没有。那么gets 不再是 C 函数了。你需要回到你的 C 入门。
  • for(i=0;i=10;i=i+1) 你觉得这有什么作用?请see
  • 基础,尝试调试你的代码……错误太多了
  • while('x' == 'char') 永远不会是真的。
  • 1) 查看您自己的代码超过一秒钟,2) 使用市场上的任何编译器,它们都会对条件内的意外赋值发出警告。 3) 用火烧掉你学习 C 的源泉。 gets 是一个已经过时了 20 多年的功能。您正在向一个至少在岩石下生活了那么长时间的人学习。

标签: c string validation


【解决方案1】:

代码中的各种问题,所以将围绕标题主题。

只输入 5 到 10 个字符的字符串?
关于如何将数据类型验证为仅允许输入的字符串的任何建议?


使用fgets() 读取用户输入的。我会使用辅助函数。

scanf() 不能很好地从错误输入中恢复。不要使用它。

确保使用足够大的缓冲区来容纳读取的 10 个字符和附加的 空字符@Weather Vane

// Return 1 on success
// Return -1 on EOF
// Return 0 on failure (too long or too short)
// `x` must be at least size `max + 1`

int read_line_min_max(char *x, size_t min, size_t max) {
  if (fgets(x, max + 1, stdin) == NULL) return -1;
  size_t len = strlen(x);
  if (len > 0 && x[len - 1] == '\n') {
    x[--len] = '\0'; // lop off potential \n
  } else {
    // more data to read, but saving not needed, simply consume it
    int ch;
    while ((ch = fgetc(stdin)) != '\n' && ch != EOF) {
      len++;
    }
  }
  return (len >= min) && (len <= max);
}

例子

#define READ_MIN 5
#define READ_MAX 10
char buffer[READ_MAX + 1];
int result;
do {
  printf("Please enter 5-10 Characters\n");
  result = read_line_min_max(buffer, READ_MIN, READ_MAX);
} while (result == 0);

while('x' == 'char') 不清楚。

也许应该是while(strcmp(x, "char") != 0)

【讨论】:

  • 应该是char buffer[READ_MAX + 2]; 包含换行符以及终止nul 吗?还是基于换行符(如果是第 11 个字符)不会被读取就可以了吗?
  • @WeatherVane 我选择了READ_MAX + 1,因为这就是调用者所需要的全部。 "0123456789\n" 输入的 '\n'fgetc() 部分中读取。当函数返回时,buffer[] 永远不会包含 '\n',因此对于 null 字符,+1 就足够了。
  • 确实如此,但换行符可能会留在输入缓冲区中并阻止某人的下一个输入;)
  • @WeatherVane 在stdinread_line_min_max() 中没有留下换行符。如果fgets()没有找到,则被fgetc()消费。
  • 哦,是的。答案值得我 +1
猜你喜欢
  • 2011-03-25
  • 2015-02-08
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多