我的程序必须从标准输入中只读取一个字符,所以我使用read(0, buffer, 1).但是如果用户插入多个单个字符,它们会保留在某个缓冲区中,当我read再次调用它时,它们仍然存在.
那么,我怎么能丢弃这些字符呢?我希望当我read再次呼叫时,缓冲区中充满了新角色,而不是旧角色.
一个例子:我有一个read(0, buffer, 1)用户写abcde.我的缓冲区包含一个(和它是正确的),但后来我打电话read(0, buffer, 1)再次,我想下一个字符从现在写的用户,而不是b之前写的.
我需要做以下事情:
int main(void) {
char a,b,cstring;
printf("please enter something");
scanf("%c %c",&a,&b);
prinf("thanks, now some more");
fgets(cstring,35,stdin);
}
问题是每当我从scanf输入第一个变量时,它都会跳到程序的末尾.我该如何做多个输入?
我在Linux GCC中使用了fflush()但它没有用.该功能有其他替代方案吗?这是我的代码:
#include<stdio.h>
void main()
{
  char ch='y';
  while(ch=='y')
  {
    int a;
    printf("Enter some value:");
    scanf("%d",&a);
    fflush(stdin);
    printf("Do you want to continue?");
    scanf("%c",&ch)
  }
我得到的输出是:
Enter some value: 10
然后程序结束.就这样.我在Linux中可以做什么?有替代功能吗?
我已经找到了while((c = getchar()) != '\n' && c != EOF)在这里使用清除stdin 几次的例子,并尝试在通过fgets获取输入的循环中使用它.我需要刷新,因为循环从最后一个输入获取\n字符并再次运行它.
那么现在发生的是我现在必须按两次输入.为什么会发生这种情况,我该如何解决这个问题呢?
#define BUFFER_LIMIT 50
do
{
  int c;
  while ((c = getchar()) != '\n' && c != EOF);
  printf("console> ");
  fgets(input_buffer, BUFFER_LIMIT-1, stdin);
  if(do_something(input_buffer))
    break;
} while(strncmp(input_buffer, "quit", 4) != 0);
我有以下代码,
fflush(stdin);
print("Enter y/n");
scanf("%c",&a);
在这里,它在输入之前就退出了.看起来问题是因为它没有刷新可能有一些垃圾字符的输入缓冲区.是否有替代flush(stdin).这个代码片段在Solaris中工作但它不适用于Linux.
新来的,我有一个非常简单的问题.我在C中制作一个简单的程序,要求用户输入如何处理char的选择.输入结果后,程序返回菜单.然而,它似乎采取某种鬼输入,好像char有一些未知的值.我需要将char设置回其默认状态.
码:
/* display menu for user */
void menu() {
    printf("\n- - - Phone Book Database - - -\n");
    printf("\nSelect an action:\n\n");
    printf("\tc:\tCreate a database entry.\n");
    printf("\ts:\tSearch the database entries.\n");
    printf("\td:\tDelete a database entry.\n");
    printf("\tq:\tQuit program.\n\n");
    printf("Enter choice: ");
    menu_choice = getchar();
    if(menu_choice != 'c' && menu_choice != 's'
        && menu_choice != 'd' && menu_choice != 'q') {
            printf("\n\n\tInvalid choice.\n");
            menu();
    }
    //fflush(stdin);
}
这是一个示例输出:
- - - Phone Book Database - - -
Select an action:
    c:  Create …scanf像这样放置空间的目的是什么
scanf(" %c",&ch) 
代替
scanf("%c",&ch)?
什么是输入缓冲区fflush(stdin)?
我写了一个程序,它应该取一个字符串和一个字母,然后调用一个函数,它有两个参数(字符串,字母),然后计算字符串中字母的频率.
我的代码的问题是它总是返回num值为零的任何字母.
#include <stdio.h>
#include <stdlib.h>
int Occur(char [], char);
int main()
{
    char s[100], l;
    printf("Enter A String:\n");
    scanf("%s",s);
    printf("Enter A Letter:\n");
    scanf("%c",&l);
    getchar();
    printf("Num Of Occurance is %d ",Occur(s,l));
    return 0;
}
int Occur(char S[100], char L)
{
    int i;
    int num=0;
    for(i=0; S[i]!='\0'; i++)
    {
        if(S[i]==L)
        num++;
    }
    return num;
}
当我使用该功能时fgets,程序会跳过用户输入,影响程序的其余部分.具有此效果的示例程序是:
#include <stdio.h>
int main() {
    char firstDigit[2];
    char secondDigit[2];
    printf("Enter your first digit: ");
    fgets(firstDigit, 1, stdin);
    printf("\nEnter your second digit: ");
    fgets(secondDigit, 1, stdin);
    printf("\n\nYour first digit is %s and your second digit is %s.\n", firstDigit, secondDigit);
}
然后我想也许问题fgets可能是写新行,所以我改变了代码来解释:
#include <stdio.h>
int main() {
    char firstDigit[3];
    char secondDigit[3];
    printf("Enter your first digit: ");
    fgets(firstDigit, 2, stdin);
    printf("\nEnter your second digit: ");
    fgets(secondDigit, 2, stdin);
    printf("\n\nYour first digit is %c and your second digit is …我知道有关带有[转换说明符的scanset的介绍,该说明符随后指示字符是否与^符号的其他插入匹配或不匹配。
为此,在ISO / IEC 9899/1999(C99)中声明:
The characters between the brackets (the scanlist) compose the scanset, unless the character after the left bracket is a circumflex (^), in which case the scanset contains all characters that do not appear in the scanlist between the circumflex and the right bracket.
So, the expression [^\n] means, that it is scanning characters until a \n character is found in the according stream, here at scanf(), stdin. \n is …