2017-06-06 67 views
0
struct Demo{ 
    char a[50]; 
    char b[50]; 
    int a; 
}; 

注:我们不能使用gets方法以及

所以,如果有任何其他的方法是那里,请公关欢迎我。

+4

你的输入是怎样的?如果是一行一行地,'fgets()'应该是好的。 –

+1

不应该在'scanf(...)'的某个地方有'%'? – Yunnosch

+1

有没有办法给出这样的好答案,请提供[MCVE](https://stackoverflow.com/help/mcve) –

回答

2

读取用户输入的线char a[50];其修剪潜在尾随'\n':应付消耗过多的长条输入线和使用这样name.a[]的最后一个元素是需要

if (fgets(name.a, sizeof name.a, stdin)) { 
    name.a[strcspn(name.a, "\n")] = '\0'; // trim \n 
} 

工作:

// Alternative 
if (scanf("%49[^\n]", name.a) == 1) { 
    // consume trailing input 
    int ch; 
    while ((ch = fgetc(stdin)) != '\n' && ch != EOF) { 
    ; 
    } 
} else { // Handle lines of only \n, end-of-file or input error 
    name.a[0] = '\0'; 
} 

scanf("%49[^\n]%*c", name.a) APPR oach在2种情况下有问题:
1)输入仅为"\n"name.a'\n'仍保留在stdin中。
2)输入长度超过49个字符(除'\n'之外),%*c消耗一个额外的字符,但长输入行的其余部分保留在stdin
这两个问题都可以通过附加代码解决。

+0

如果检查超出部分的存在,请将它改为''%49 [^ \ n]%c“'例如。它也是'fgets'所必需的。 – BLUEPIXY

+0

@BLUEPIXY'“%49 [^ \ n]%* c”'忽略多余部分? – Yunnosch

+0

@Yunnosch我在说的是,在OP示例代码中,既不检查是否有多余部分。换句话说,测试不一定只针对'scanf'。 – BLUEPIXY