无法理解为什么我无法循环%[^ / n]

时间:2018-11-07 13:35:51

标签: c loops scanf

我似乎找不到问题所在。

在第一个循环中,我可以输入债权人的名字,但是在第二个循环中,我不能输入债权人的名字。

int main(){
    float cb,ir,si,sum=0,totaldebt;
    int time,i;
    char name[25];
    printf("------------Welcome to Debt Management System-------------");

    for (i=1;i>=1;i++){
        printf("\n%d)Name of the creditor: ",i);
        scanf("%[^\n]",&name);
        printf("Enter your current balance: ");
        scanf("%f",&cb);
        printf("Enter its interest rate: ");
        scanf("%f",&ir);
        printf("Enter time for the loan: ");
        scanf("%d",&time);
        si=cb*ir*time/100;//simple interest
        totaldebt=si+cb; //simple interest + current balance

        if (name=='none'){
            break;
        }
    sum+=totaldebt;
}

它跳过了scanf部分,我有点猜测该阅读部分似乎被先前的阅读所卡住了。

3 个答案:

答案 0 :(得分:3)

要获得想要的效果,%[^\n]*c应该为%[^\n]%*c。您需要第一个模式的说明符,然后是单个字符的说明符。现在编写的方式是,要求scanf将所有内容匹配到换行符,然后读取序列*c

它无法读取该序列,但与第一个说明符匹配。因此,您最终得到的未使用换行符可能会使您的其他输入失效。

您的for (i=1;i>=1;i++)还存在潜在的问题,即该病很严重,并且可能会持续一段时间。

现在,尽管这可能都是一个有趣的练习,但我建议您抛开scanf并切换到fgets以读取输入行。它不那么隐秘,它迫使您传递缓冲区大小,与scanf相比,使用它要更容易,更安全。

答案 1 :(得分:3)

要完成第一个答案,我注意到了这个问题:

if (name=='none')
{
    break;
}

此格式在C语言中不正确,您应该:

  • 使用strcmp 功能
  • 使用"而不是'来定义字符串:


/* if two strings are the same --but not necessary at the same adress-- strcmp return 0*/
if (0 == strcmp(name, "none"))
{        
    break;
}

答案 2 :(得分:0)

在输入字符串时,不需要使用引用运算符'&'。这就是为什么在您的第一个scanf语句中使用name而不是&name的原因。如果要在输入中使用换行符,请使用%* c修改输入语句,如下所示。其他错误已在上述答案中指出。 scanf(“%[^ \ n]”,name);要么 scanf(“%[^ \ n]%* c”,name);