#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
и используя его как строку. Сначала исправьте вашу проблему со строками, а затем мы рассмотрим ее, если она все еще происходит.