C - 如果用户插入多个字符

时间:2017-06-14 19:32:56

标签: c input character

编辑@ 我只会使用一个字符串,因为我似乎找不到用字符解决这个问题的方法

我有以下内容:

char character;
int valid = 1;

do {

    if( valid == 0 ) {
        printf("ERROR");
    }

    valid = 1; // Validates it again if the do while loop activates

    character = inputCharacter("Insert the character: ");
    system("clear");

    if( certainCondition ) {
        valid = 0;
    }

} while( valid != 1 ); 

inputCharacter:

char inputCharacter(char* message) { // Inputs a character

    char character;

    printf("%s", message);
    scanf(" %c", &character);

    return character;

}

这个函数会接受一个字符,如果它等于我输入的另一个字符,它会要求一个新字符。

我想知道的是:

是否可以检查字符输入是否包含多个字符,如果是,请在输入“错误:仅限一个字符”时要求输入新字符?

示例:

第一个字符:e

插入字符:e  | ERROR

插入字符:easd  |错误:请仅插入一个字符

插入字符:wflek  |错误:请仅插入一个字符

插入字符:a  | 接受

这可不使用字符串吗?

(如果我不能在不允许多个字符的情况下发出错误,那就好了,但如果我能够这样做会很酷)

4 个答案:

答案 0 :(得分:3)

使用fgets()获取一行文本并使用sscanf()来解析该行的错误更少。这也是一种更灵活的方法,允许在必要时对输入线进行多次扫描。请注意,如果缓冲区中有空间,fgets()会保留换行符。因此,一种方法是读取一行文本,并获得第一个字符和第二个字符。如果两个字符都已成功读取,而第二个字符为\n,则输入符合预期。

您应该始终检查返回值的函数的返回值。这可用于帮助验证输入。在下面的代码中,如果sscanf()未返回2,则表示未输入字符(换行符除外)。如果扫描了两个字符,则第二个字符应为\n;如果不是,则用户输入了多个字符(不包括换行符)。另请注意,检查fgets()本身的返回值是否有错误;此处的错误会导致程序以错误消息终止。

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

#define BUF_SIZE  1000

int main(void)
{
    char c, rest;
    char buffer[BUF_SIZE];

    do {
        printf("Please enter exactly one character: ");
        if (fgets(buffer, BUF_SIZE, stdin) == NULL) {
            perror("Error in fgets()");
            exit(EXIT_FAILURE);
        }
    } while ((sscanf(buffer, "%c%c", &c, &rest) != 2) ||
             (rest != '\n'));

    printf("You entered: %c\n", c);

    return 0;
}
Sample program interaction:

Please enter exactly one character: 
Please enter exactly one character: fgh
Please enter exactly one character: h
You entered: h

答案 1 :(得分:3)

  

可以不使用字符串(用于输入)(?)

使用fgetc()/fgetchar()一次读取一个字符。

int read1char(const char *prompt, const char *reprompt) {
  int ch;
  do {
    // print prompt
    fputs(prompt, stdout);
    fflush(stdout);
    prompt = reprompt;

    // Read first character
    ch = fgetc(stdin);
    if (ch == '\n') continue;
    if (ch == EOF) break;

    // Look for a \n or EOF
    int cheol = fgetc(stdin);
    if (cheol == '\n' || cheol == EOF) break;

    // consume rest of the line
    do {
      ch = fgetc(stdin);
    } while (ch != '\n' && ch != EOF);
  } while (ch != EOF);
  return ch;
}

int main(void) {
  int ch;
  while ((ch = read1char("Insert the character: ",
      "\nERROR: One character only\n" "Insert the character: ")) != EOF) {
    printf("<%c>\n", ch);
  }
}

答案 2 :(得分:1)

  

是否可以检查字符输入是否包含多个字符,如果是,请在输入“错误:仅限一个字符”时要求输入新字符?

让我们首先将双管问题解开为两个问题。将来,请避免合并这样的问题。

第一部分:

  

是否可以检查字符输入是否包含多个字符......?

没有。角色不可能存储多个角色。如果您想存储多个字符,则需要的存储空间不仅仅是一个char

第二部分:

  

...如果是这样,请在输入“错误:仅限一个字符”时要求输入新字符?

     

......如果不使用字符串,这可能吗?

假设stdin只包含一个字符(来自第一部分),然后要求另一个字符,这是没有意义的,是吗? ?

我认为你的意思是要求一行只包含一个字符的输入。您需要考虑输入行的定义。

在相关的说明中,您需要意识到" %c"中的空格不仅会导致空格被丢弃;它也会丢弃换行符。如果您只想删除空格,请先使用scanf("%*[ ]"); ,然后使用"%c"。这两个调用应该是分开的( not combined ),因为当 no 空格时,第一个调用将失败,导致提前返回。

输入行'\n'或换行符结尾;与您想要的仅一个字符配对意味着您需要读取至少两个字符才能检查仅一个字符单独存在于一条线上。即这样的事情可能是合适的:

int c;
do {
    printf("%s", message);
    scanf("%*[ ]"); // discard leading spaces
    c = getchar();
} while (/* check for empty line      */    c == '\n'
         /* check for multiple chars  */ || getchar() != '\n'
         /* discard multiple chars    */ && scanf("%*[^\n]") == 0
         /* discard the trailing '\n' */ && getchar() == '\n'
         /* print error message       */ && puts("ERROR: One character only") != EOF);

答案 3 :(得分:0)

我想说,最简单的方法是使用字符串,类似这样的

    char character[255] = "";  
    scanf("%255s", character); // or use gets(character);

    if(character[1] == 0)
    {
       // 1 char entered
    } else {
       // more than one
    }