【问题标题】:How do I take one word as input from the user, and print "illegal input" if there's a number or a space?如何将一个单词作为用户输入,如果有数字或空格,则打印“非法输入”?
【发布时间】:2023-03-10 18:31:01
【问题描述】:
char word[20];
printf("Enter a word: ");
gets(word);
for(int i=0;i<strlen(word);i++){
    if((word[i]>=97 && word[i]<=122) || (word[i]>=65 && word[i]<=90)){
        printf("Alphabet");
        break;
    }else{
        printf("Illegal input");
        break;
    }
}

为什么这是错误的?我只需要用户的一句话。如果有任何空格或非字母字符,它必须打印非法输入。我该如何纠正这个问题?

【问题讨论】:

  • 这段代码有什么问题?一个好的问题必须包含对问题的描述。
  • 您的代码只检查第一个字符和break

标签: c input


【解决方案1】:

您的代码问题与字母字符检查无关:实际上,您实际上只是检查字符串的第一个字符,因为 您在两个 @ 中都中断了循环987654323@ 和else 分支.

我想您只是想在发现无效字符时中断详细说明:

#include <ctype.h>
#include <string.h>

char word[20];
printf("Enter a word: ");
fgets(word, 19, stdin);

word[strcspnn(word, "\n")] = 0;

for(int i=0;i<strlen(word);i++){
    if((isalpha(word[i]))){
        printf("Alphabet");
        // break;  // No break required here!
    }else{
        printf("Illegal input");
        break;
    }
}

请注意如何:

  • 我使用了fgets 而不是gets:后者被弃用,因为它不安全。另一方面,fgets 能够控制获取的字符数,而不会有超出word 数组大小的风险
  • 因为fgets 也存储了尾随换行符,所以我搜索它并用字符串终止符替换(如图所示 [here])(https://stackoverflow.com/a/28462221/11336762)
  • 使用所有这些幻数来检查字符的范围是不好的做法。您可以使用包含在ctype.h 中的标准函数isaplha() 来做同样的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多