Не могу понять, почему я не могу зациклить% [^ / n] - PullRequest
0 голосов
/ 07 ноября 2018

Я не могу найти, где проблема здесь.

Во время первого цикла я могу ввести имя кредитора, но не могу сделать это во втором цикле.

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 голосов
/ 07 ноября 2018

Чтобы завершить первый ответ, я заметил эту проблему:

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;
}
0 голосов
/ 07 ноября 2018

При вводе строки вы не обязаны использовать оператор ссылки '&'. Вот почему в вашем первом выражении scanf используйте имя вместо & name. Также измените оператор ввода с помощью% * c, если вы хотите использовать символ новой строки во вводе, как показано ниже. Другие ошибки были указаны в ответах выше. зсапЕ ( "% [^ \ п]", имя); ИЛИ ЖЕ зсапЕ ( "% [^ \ п]% * с", имя);

0 голосов
/ 07 ноября 2018

Чтобы получить эффект, который вам нужен, %[^\n]*c должно быть %[^\n]%*c. Вам нужен спецификатор для первого шаблона, а затем спецификатор для одного символа. То, как вы это написали, теперь заставляет scanf сопоставить все до новой строки, а затем прочитать последовательность *c.

Он не может прочитать эту последовательность, но соответствует первому спецификатору. Таким образом, вы получите неиспользованный символ новой строки, который, вероятно, отключит ваш другой ввод.

Существует также потенциальная проблема вашего for (i=1;i>=1;i++), это условие подозрительно и может продолжаться некоторое время.

Теперь, хотя это все, вероятно, забавное упражнение, я предлагаю вам бросить scanf и переключиться на fgets, чтобы прочитать строки ввода. Он менее загадочный и заставляет вас передавать размер буфера, что делает его использование несколько проще и безопаснее по сравнению с scanf.

...