由于获取功能,scanf无法正常读取

时间:2017-04-30 00:52:39

标签: c scanf

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

int main(){
    int n=1,i,cont;
    char string[50];

    scanf("%d",&n);
    while(n!=0){
        gets(string);
        cont=0;
        for(i=0;i<strlen(string);i++){
            if(string[i]=='.'){
                cont++;
            }
        }
        if(cont%2==0){
            printf("S\n");
        }else{
            printf("N\n");
        }
        scanf("%d",&n);
    }
    return 0;
}

我的问题很简单但很麻烦,我想读取一个整数值n,然后读取一个字符串,然后再次读取n,但每当我运行程序时,它只读取字符串值...但是如果我数字0程序结束......就像我的scanf在获取功能中一样。

3 个答案:

答案 0 :(得分:2)

scanfgetsfgets混合是很麻烦的,因为它们各自处理新行不同。

摆脱gets电话(无论如何都不安全)并将其替换为以下scanf电话:

scanf("%49s", string);

这将最多49个字符读入string(即比其大小少一个)。

答案 1 :(得分:0)

从OP&#39; comments,听起来目标是能够读取包含空格的字符串。虽然有很多方法可以使用scanf()来实现这一目标,但最好使用fgets(),这至少不容易出错。

fgets()函数可用于将数字的输入读入缓冲区,然后sscanf()可以处理此缓冲区以提取数字。由于fgets()保留换行符,因此不会干扰下一个I / O操作。

但是,当fgets()用于获取字符串时,由于保留了换行符,因此可能需要将其删除。这可以通过多种方式完成,但此处strcspn()用于提供遇到的第一个\r\n字符的索引;然后将\0字符写入此位置,从字符串中删除终止换行符。

以下代码说明了这些建议。请注意,buffer[]string[]都被慷慨地分配,以适应相当大的输入。如果用户输入大量字符(在这种情况下超过999),则在输入流中留下额外的字符用于下一个I / O函数调用。还要注意主循环已经简化了一点;现在有一个for(;;)循环永远不会终止,当用户输入0数字时就会中断。并且,主循环中有一个嵌套循环,提示用户输入一个数字,直到输入有效数字。由于#include <stdlib.h>是不必要的,因此将其删除。更好的代码会检查从fgets()调用返回的值是否存在可能的错误。

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

int main(void)
{
    int n = 1, cont;
    char buffer[1000];
    char string[1000];

    for (;;) {

        /* Loop until user enters a number */
        do {
            printf("Please enter a number: ");
            fgets(buffer, sizeof buffer, stdin);
        } while (sscanf(buffer, "%d", &n) != 1);

        /* Break on 0 */
        if (n == 0) break;

        /* Get a string, and remove trailing newline */
        printf("Please enter a string\n");
        fgets(string, sizeof string, stdin);
        string[strcspn(string, "\r\n")] = '\0';

        cont = 0;
        for (size_t i = 0; i < strlen(string); i++) {
            if (string[i] == '.') {
                cont++;
            }
        }
        if (cont % 2 == 0){
            printf("S\n");
        } else {
            printf("N\n");
        }
    }

    return 0;
}

答案 2 :(得分:-3)

当你为一个例子输入5时,你会在之后点击一个新的行字符。 所以你输入2个字符:5和一个换行符。 这个新的角色正在引起你的头痛。

新行字符也被视为输入。

为了忽略这个新的行char,只需添加一个充当垃圾收集的新行:

 char garbage[50];

 scanf( "%d", &n);
 fgets(garbage, sizeof(garbage), stdin);