gpt4 book ai didi

c - fgets 之后获取键盘输入

转载 作者:行者123 更新时间:2023-11-30 18:06:54 24 4
gpt4 key购买 nike

我一生都无法平静地对待 C 字符串和输入/输出。

对于我的程序,我只需输入一个字符串,然后在以下代码中对其进行处理:(tmpstring 和 ch 已定义)

对于我的传入输入,我在终端中写入: echo "test"| ./程序

    int main(int argc, char *argv[]) {
char tmpstring[2048];
int ch;
int r;
int c;

fgets(tmpstring, sizeof tmpstring, stdin);
while((ch = fgetc(stdin))!= EOF && ch != '\n');
tmpstring[strlen(tmpstring)-1]='\0';

strncpy(opponent, tmpstring+1, strlen(tmpstring+1));

move();

move() 内部;

    char buffer[2048]={0};
int r, c;
r=0; c=0;
printf("Your move (row column):");
if((fgets(buffer, sizeof buffer, stdin)==NULL) || ((sscanf(buffer,"%d %d", &r, &c))!=2)){
printf("Invalid input. Please insert two numbers separated by whitespace.\n");
exit(1);
}
//continues

执行此操作会直接进入无效输入,而不要求更多输入。我已经阅读了有关如何不应该清除标准输入的所有内容(并且这是不可能的),但我真的不知道该怎么办。我显然试图用 while 循环的第二部分“转储”stdin。我已将第一个条件后的 && 更改为 ||在 while 循环中。不用找了。总的来说,在使用了 fgets 后如何请求更多输入?

*编辑:更多代码并分离原始 while 循环

最佳答案

此类问题已在其他地方讨论过。
我将从这里复制我自己帖子的一部分:

Max string length using scanf -> ANSI C

  • 定义了一个函数my_scanf()具有可变数量的参数,通过调用stdarg.h库, union 到 fgets() 的组合和vsscanf()
  • 该函数旨在以正确的方式处理 fgets() 的组合和sscanf() (实际上,我们必须使用 vsscanf() 才能正确处理参数列表)。
  • 读取输入的字符数达到上限。如果输入超过此限制,则会被截断。 '\n' 已正确处理。该函数返回与 scanf() 相同的值会回来的。所以,你可以使用my_scanf()反而。

这里有代码:

#include <stdio.h>
#include <stdarg.h>

int my_scanf(const char* fmt, const unsigned int maxbuff, ...) {
va_list ptr;
int ret;

if (maxbuff <= 0)
return EOF; /* Bad size for buffer[] */

char buffer[maxbuff+1];
buffer[maxbuff-1] = '\0'; /* Quick buffer cleaning... */

if (fgets(buffer, maxbuff+1, stdin) == NULL)
return EOF; /* Error detected */
else {
if ((buffer[maxbuff-1] != '\n') && (buffer[maxbuff-1] != '\0'))
/* Condition logically equivalent to:
fgets() has not reached an '\n'
*/
while (getchar() != '\n')
; /* "Flushing" stdin... */

va_start(ptr, maxbuff);
ret = vsscanf(buffer, fmt, ptr);
va_end(ptr);
return ret;
}
}

#define MAXBUFF 20
int main(void) {
int x;
float z;
int scanf_ret = my_scanf("%d %g", MAXBUFF, &x, &z);
printf("\nTest:\n x == %d\n z == %g\n scanfret == %d", x, z, scanf_ret);
getchar();
return 0;
}

函数 my_scanf() 具有原型(prototype)

int my_scanf(const char* fmt, const int maxbuff, ...);
  • 它接受格式字符串 fmt其行为方式与任何其他 scanf() 相同- 就像那样。
  • 第二个参数是从标准输入(键盘)有效接受的字符的最大数量。
  • 返回值为int,即EOF如果maxbuff没有意义,或者发生了一些输入错误。如果返回非负值,则与标准函数sscanf()返回的值相同。或vsscanf()

    1. 在函数内部,maxbuff增加 1,因为 fgets()为额外的“\0”字符腾出一些空间。
    2. maxbuff 的非正值立即被丢弃。
    3. fgets()将从 stdin 读取一个字符串(键盘)最多有maxbuff的空间字符,包括 '\n'。
    4. 如果用户输入了非常长的字符串,那么它将被截断,并且需要某种“刷新”机制,以便丢弃下一个“\n”之前的所有字符(ENTER )。如果不是,下一次键盘读取可能会出现较旧的字符,这根本不是我们所希望的。
      • “冲洗”的条件是fgets()读取 stdin 后尚未到达 '\n' 。
      • 当且仅当 buffer[maxbuff - 1] 时,这才是正确的。不等于 '\0' 也不等于 '\n'。 (检查一下!)
    5. 最后,stdarg.h 的适当(和标准)组合和函数vsscanf()用于处理参数的变量列表。

关于c - fgets 之后获取键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com