fgets()工作笨拙

时间:2018-06-22 17:51:19

标签: c fgets

所以很长一段时间我都使用scanf(),但是当输入的长度比字符串长时,它总是困扰我,使代码混乱(更改其他int等)。

因此有人告诉我,我应该改用fgets(),因为它会限制它读取的字母和符号的数量。

但是fgets()总是也包含换行符(\ n),因此建议我使用命令input[strcspn(input, "\r\n")] = '\0';,该命令应从字符串中删除\ n。

当然还有另一个问题。当输入比字符串长时,会发生以下两种情况之一:

1。 (不正确,通过使程序正确循环进行修复)

  1. 它跳过下一个fgets()(一个或多个)。

我在某处读到了可能是因为fgets()在下一次调用时会读取其余的输入,但是我在每次再次写入该字符串之前都尝试清空该字符串,但这没有帮助。

有人知道如何解决此问题吗?这困扰了我一段时间,因为我从未实现过对字符串程序的完美输入(随着人们的失误,会出现故障保护)

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

char input[3];

int main(){
    begin:
    fgets(input, 3, stdin);
    input[strcspn(input, "\r\n")] = '\0';
    if(strcmp(input, "1")==0){
        printf("input = 1\n");
    }
    else if(strcmp(input, "2")==0){
        printf("input = 2\n");
    }
    goto begin;
}

可悲的是,我无法重新创建第一个问题,但是通过输入xx1或xx2可以解决第二个问题。

谢谢!

2 个答案:

答案 0 :(得分:2)

您应该通过测试最后一个字符是否为换行符来检查df1 <- Reduce(function(x,y) { z <- merge(x,y,all=T,by=0) rownames(z) <- z[[1]] z[-1]}, lst) df1[is.na(df1)] <- 0 是否读取了整行。如果是这样,请用一个空字节替换换行符;如果不是,请继续阅读字符,直到获得换行符为止。

fgets()

答案 1 :(得分:0)

以下建议的代码:

  1. 消除goto
  2. 利用了fgets()的返回值
  3. 不包括那些未使用的头文件
  4. 允许“ \ n”处理任何其他“行尾”序列。
  5. 消除“魔术”数字

现在是建议的代码:

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

#define BUF_LEN 3

char input[ BUF_LEN ];

int main( void )
{
    while(  fgets(input, sizeof input, stdin) )
    {
        input[strcspn(input, "\n")] = '\0';

        if(strcmp(input, "1")==0){
            printf("input = 1\n");
        }

        else if(strcmp(input, "2")==0){
            printf("input = 2\n");
        }
    }
}

这是典型的代码运行(请记住即使没有打印任何内容,循环也会继续进行:

1
input = 1
2
input = 2
3
4
5
6
1
input = 1
kj;lkj;lkj
1jklkl;j
1
input = 1
x1
xx1
input = 1