Для цикла, который не останавливается или не обновляет начальное значение

#c #for-loop #scanf

#c #цикл for #scanf

Вопрос:

Я только начал учиться программировать и играю с указателями и scanf. Я пытаюсь создать программу, которая запрашивает у пользователя n (случаев в коде), а затем пользователю предлагается ввести числа n количество раз, однако, как только я нахожусь в терминале, он не останавливается.

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


int main (void)
{    
     int cases;
     //prompt the user for number of cases

     printf("cases:n");
     scanf("%d",amp;cases);
 

     // will print the number of digits of the users number
     for (int j = 0; j < cases; j  )
     {   
         printf ("#%i:n",j   1);
    
          char x;
    
          int size;
    
          scanf(" %s",amp;x);
    
          size = strlen(amp;x);
           
           //use printf to see what the program is doing
            printf("the number of cases are:%d",cases);
    
            printf("the current case is:%dn",j   1);
    
            printf("the number of digits are:%in",si
     }    
        //print back the users input
        for (int i = 0; i < size; i  )
        {
            printf("%c", *(amp;x   i));
        }

        printf("n");

}
 

После компиляции и попытки нажать enter «#number» не обновляется, и это то, что появляется:

 cases:
3
#1:
564
the number of cases are:3
the current case is:13367
the number of digits are:3
 

или также

 cases:
5 
#1: 
3 
the number of cases are:5
the current case is:1
the number of digits are:1  
#2:
4 
the number of cases are:5
the current case is:1
the number of digits are:1
#2:
6
the number of cases are:5
the current case is:1
the number of digits are:1
#2:
7
the number of cases are:5
the current case is:1
the number of digits are:1
#2:
7
the number of cases are:5
the current case is:1
the number of digits are:1
#2:
8
the number of cases are:5
the current case is:1
the number of digits are:1
 

Я пытался понять, почему это происходит, но не смог найти ответ.

Спасибо!

Комментарии:

1. Вы неправильно скопировали код, в строке, которая печатает количество цифр, отсутствует конец.

2. %s формат предназначен для чтения строки, но x представляет собой один символ.

Ответ №1:

Во-первых, вы не объявили строку, вы объявили символ и обработали его как строку, что вызовет у вас всевозможные проблемы. Вероятно, поэтому вы получаете странные значения. char x должна быть char x[16] или какой бы ни была максимальная длина (в цифрах) числа плюс единица, потому что строки заканчиваются нулевым символом (0) в C. Когда вы ссылаетесь на эту строку, поскольку это массив символов, вам не нужен оператор адреса amp; (если вы не хотите, чтобы указатель настрока вместо самой строки, скажем, если вы передавали ее как выходные данные из функции). printf("%c", *(amp;x i)) лучше и понятнее записывается как printf("%c",x[i]) или даже putchar(x[i]) .

scanf плохо работает с пользовательским вводом. Лучше всего использовать fgets для этой цели. Это также безопаснее, поскольку fgets занимает максимальную длину. Использовать stdin для FILE аргумента. Обязательно проверьте возвращаемое значение; это будет значение NULL , когда данных больше не будет. Обычно это происходит, когда вы нажимаете Control-D клавишу в Unix или Control-Z клавишу в Windows.

Комментарии:

1. Спасибо @eewanco, это было действительно полезно. Большое вам спасибо.

2. Кроме того, почему scanf ненадежен при вводе пользователем, везде, где я смотрю, говорится, что это не подходит для этого?

3. Но почему не печатается #number? Почему он бесконечно повторяется, когда я нажимаю enter? Потому что значения #number останавливаются на # 2 и повторяются?, это потому, что читает один и тот же адрес памяти снова и снова?

4. Все ставки отменяются, потому что вы перезаписываете память, определяя только один char и используя его как строку. Сначала исправьте вашу проблему со строками, а затем мы рассмотрим ее, если она все еще происходит.