无法弄清楚这种循环行为

时间:2016-04-05 06:36:36

标签: c

我正在处理一个文件处理项目,用户可以指定他想要输入的次数,内容将以表格格式存储在文件中。我的代码是:

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

int main(void)
{
    int n;
    FILE *fptr;
    fptr=fopen("input.txt", "w");

    if(fptr==NULL)
         printf("The file could not be opened.");

    printf("\nFile opened successfully.");

    printf("\nHow many inputs do you want to make?");
    scanf("%d", &n);

    printf("\nEnter contents: \n\n");

    char name[50];
    int age;
    float salary;
    int i;

    for(i=1;i<=n;i++)
    {
       printf("\nName(Not more than 50 character): ");
       gets(name);

       if(name[strlen(name)-1]=='\n')
            name[strlen(name)-1]='\0';

       printf("\nAge: ");
       scanf("%d", &age);

       printf("\nSalary: ");
       scanf("%f", &salary);

       fprintf(fptr, "%s\t\t%d\t$%.2f\n", name, age, salary);
    }
}

我遇到的问题是循环无法正常执行。我不能输入名字。它会跳过名称并直接进入年龄输入。我试过fgets(),scanf(“%[^ \ n] s,名字)但没有用。所以我希望我能在这里得到一些帮助。问候。

2 个答案:

答案 0 :(得分:5)

在循环之前你做

scanf("%d", &n);

它读取数字,但不是你终止输入的换行符,将换行符保留在输入缓冲区中。所以在你做的循环中

gets(name);

它将换行符读为空行。您需要从之前的scanf电话中跳过所有剩余字符,包括换行符。例如,你可以有一个循环,你可以一次读取一个字符,直到你读完换行符。

作为旁注:请勿使用gets。这是危险的,自C99标准以来已被弃用,并且最新的C11标准已完全删除。建议的替换为fgets

答案 1 :(得分:0)

尝试

   scanf ("%s", &name); 

这对我有用......如果没有,请发布它给你的输出,我会尝试提供更多帮助。

另外,一定要看看WhozCraig的评论并修复该错误。