gpt4 book ai didi

c - 有没有一种优雅的方法来处理 C 中输入函数(getchar()、fgets()、scanf())读取的 '\n'?

转载 作者:行者123 更新时间:2023-12-05 05:40:08 25 4
gpt4 key购买 nike

我正在尝试 K&R 的一个简单练习,使用指针将 string2 附加到 string1 的末尾。在溢出的情况下,即 string1 的缓冲区不能包含所有 string2 我想提示用户重新输入 string2 或退出。

我写了下面的代码:

#include<stdio.h>
#include<string.h>
#define MAXLINE 1000
int get_input(char *s);
int str_cat(char *s, char *t);

void main()
{
char input1[MAXLINE], input2[MAXLINE], c;
get_input(input1);
check:
get_input(input2);
if((strlen(input1) + strlen(input2) + 2) <= MAXLINE)
{
str_cat(input1, input2);
printf("%s\n", input1);

}
else
{
input2[0] = '\0';
printf("String overflow\n Press: \n 1: Re-enter string. \n 2: Exit.\n");
scanf(" %d", &c);
if(c == 1){
input2[0] = '\0';
get_input(input2);
goto check;
}

}

}

int get_input(char *arr)
{
int c;
printf("Enter the string: \n");
while(fgets(arr, MAXLINE, stdin))
{
break;
}
}
int str_cat(char *s, char *t)
{
while(*s != '\0')
{
s++;
}
while((*s++ = *t++) != '\0')
{
;
}
*s = '\0';
}

最初,我使用书中提到的标准 getchar() 函数来读取 get_input() 中的输入,如下所示:

int get_input(char *arr)
{
int c;
printf("Enter the string: \n");
while((c = getchar()) != '\n' && c != EOF)
{
*arr++ = c;
}
*arr = '\0';
}
  • 我是新来的,我阅读了this并理解我的错误。我知道不应该使用不同的输入函数来读取标准输入,并且 '\n' 留在由 getchar() 选择的输入流中导致我的条件失败。

  • 因此,我决定使用 fgets() 读取输入并修改 scanf("%d", &c),如线程中所述使用 scanf("%d", c)。这确实有效(有点),但会引起我不想要的行为。

所以,我有几个问题:

  1. 在遇到 '\n' 时读取输入的 fgets() 有什么比我使用的更好的方法?

     while(fgets(arr, MAXLINE, stdin))
    {
    break;
    }
  2. fgets() 在遇到 '\n' 或 EOF 时停止读取该行并将其存储为输入。但是,它最终将 '\n' 存储在字符串的末尾。有什么办法可以防止这种情况发生,还是我必须手动覆盖 '\n'

  3. 即使我使用了 scanf("%d", &c) 的修改版本,我的输出看起来像这个:(https://imgur.com/a/RaC2Kc6)。尽管如此,当出现溢出情况时提示重新输入第二个字符串时,我得到 Enter the string: 两次。修改后的 scanf() 是否干扰了我的输入?我该如何纠正它?

最佳答案

一般来说,不要将fgetsscanf 混合使用。虽然它可能有点臃肿,但通过使用 fgets 读取输入,然后使用 sscanf 解析输入,您将避免很多问题。 (注意多余的s)

删除换行符的一个好方法是 buffer[strcspn(buffer, "\n")] = 0

例子:

// Read line and handle error if it occurs
if(!fgets(buffer, buffersize, stdin)) {
// Handle error
}

// Remove newline (if you want, not necessarily something you need)
buffer[strcspn(buffer, "\n")] = 0;

// Parse and handle error
int val;
if(sscanf(buffer, "%d", &val) != 1) {
// Handle error
}

// Now you can use the variable val

这里有一件事在某些情况下可能是危险的,那就是如果 buffer 不够大以容纳完整的一行。 fgets 不会读取超过 buffersize 个字符。如果该行较长,则剩余部分将保留在标准输入中。

关于c - 有没有一种优雅的方法来处理 C 中输入函数(getchar()、fgets()、scanf())读取的 '\n'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72477915/

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