当它应该询问输入时跳过int

时间:2017-03-26 13:52:52

标签: c

任何人都可以帮我纠正我的代码有什么问题? int以滑稽的方式表现,因为它跳过而不是让我输入数字。谢谢大家。

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


char* input_text(const char* question)
{
   char* v = (char*)malloc(256);
   printf("%s ", question);
   if(fgets(v, 255, stdin) == NULL){
      free(v);
      return(NULL);
    }

   int len = strlen(v);
   if (len > 0 && v[len-1] == '\n'){
       v[len-1] = 0;
    }
    return(v);
}

int input_number(const char* question)
{
   int k = 0;
   printf("%s", question);
   scanf("%d", &k);
   return(k);
}

//---------------------------------------------------------------------------------------------------------------------------

int main()
 {
   char* name = input_text("What is your name?  ");
   int age = input_number("What is your age?   ");
   char* bday = input_text("When is your birthday?   ");
   char* bstfriend = input_text("What is the name of your bestfriend?   ");


   printf("\n");
   printf("Your name is %s \n", name);
   printf("Your age is %d \n", age);
   printf("Your birthday is %s \n", bday);
   printf("Your bestfriend is %s \n", bstfriend);
   return(0);
 }

同样重新安排它是不可能的,因为它是专门指示这样做的。

1 个答案:

答案 0 :(得分:2)

input_number()函数在输入年龄后在输入流中留下换行符。最简单的解决方法是在getchar() scanf()之后添加input_number()以消耗不需要的换行符:

int input_number(const char* question)
{
   int k = 0;
   printf("%s", question);
   scanf("%d", &k);
   getchar();
   return(k);
}

或者,您可以编写一个函数来清除输入流:

void clear_input(void)
{
    int c;
    while((c = getchar()) != '\n' && c != EOF) {
        continue;
    }
}

...

int input_number(const char* question)
{
   int k = 0;
   printf("%s", question);
   scanf("%d", &k);
   clear_input();
   return(k);
}

由于scanf()在输入流中留下了新行,因此fgets()scanf()函数始终可以很好地协同工作,因此通常最好坚持使用{{} 1}}。您可以使用fgets()来解析输入,然后不需要清除输入流(除非用户输入的输入多于缓冲区将保留的输入;然后需要处理额外的字符):

sscanf()