所以很长一段时间我都使用scanf(),但是当输入的长度比字符串长时,它总是困扰我,使代码混乱(更改其他int等)。
因此有人告诉我,我应该改用fgets(),因为它会限制它读取的字母和符号的数量。
但是fgets()总是也包含换行符(\ n),因此建议我使用命令input[strcspn(input, "\r\n")] = '\0';
,该命令应从字符串中删除\ n。
当然还有另一个问题。当输入比字符串长时,会发生以下两种情况之一:
1。 (不正确,通过使程序正确循环进行修复)
我在某处读到了可能是因为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可以解决第二个问题。
谢谢!
答案 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)
以下建议的代码:
goto
fgets()
的返回值现在是建议的代码:
#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