Я не уверен, что вас смущает.
Используйте
char foo;
scanf(" %c", &foo);
для отдельных символов, например.буквы и
int bar;
scanf("%d", &bar);
для чисел, целых чисел.Если вместо этого вы наберете букву, scanf()
потерпит неудачу.
%[...]
для строк.
scanf()
возвращает количество успешных преобразований (или EOF
), поэтому для
int height;
int width;
scanf("%d %d", &height, &width);
возвращает 2
в случае успеха.Он может вернуть 1
, если только height
может быть прочитан.
Поэтому, чтобы проверить наличие ошибок при вводе пользователем, вы должны сделать:
int height;
int width;
if (scanf("%d %d", &height, &width) != 2) {
// handle the error, maybe exit the program.
}
Ваш код может выглядеть так (безобработка ошибок):
#define _CRT_SECURE_NO_WARNINGS // you said Visual Studio? Without it you should get
// warnings about some functions being insecure.
#include <ctype.h> // isalpha() returns true if the value is a letter
#include <stdlib.h> // EXIT_SUCCESS
#include <stdio.h> // puts(), printf(), scanf()
int main(void)
{
for(;;) { // for-ever ... endless loop since the user exits by answering
// 'n' or 'N' two times
puts("Would you like to convert a number today?\nPlease press Y or N:");
char input;
if (scanf(" %c", &input) != 1) // We reached EOF ... end of file
break; // that's improbable for stdin,
// but input could be redirected to
// read from a file instead.
if (input == 'y' || input == 'Y') {
puts("\nThank you!\nWhat number?");
int number;
scanf("%d", &number);
if (isalpha((char unsigned)number)) // *)
printf("\nYour Number \t ASCII letter\n%d\t %c\n\n", number, number);
else
puts("Sorry, but that's not the ASCII code of a letter :(\n");
}
else if (input == 'n' || input == 'N') {
puts("\nWould you like to convert a letter instead?\nPlease press Y or N:");
scanf(" %c", &input);
if (input == 'y' || input == 'Y') {
puts("\nGreat choice adventurer!\nWhat letter will it be today?");
char letter;
scanf(" %c", &letter);
if (isalpha(letter))
printf("\nYour letter \t ASCII code\n%d\t %c\n\n", letter, letter);
else
puts("Sorry, but that's not a letter :(\n");
}
else if (input == 'n' || input == 'N') {
puts("\nDifficult to please, I see...\n\nI suggest you move on with that attitude!\n");
puts("Bye bye then.");
return EXIT_SUCCESS;
}
}
else {
puts("Sorry I did not recognize your command... Please retry.");
puts("Press Y or N next time!\n");
}
}
}
*) isalpha()
(и другие функции в <ctype.h>
) ожидают значение, которое соответствует unsigned char
или значение EOF
,Он имеет неопределенное поведение для других значений.Поскольку мы читаем пользовательский ввод в int
, мы не можем быть уверены, что это так, поэтому мы должны преобразовать значение в unsigned char
, прежде чем передать его isalpha()
(и друзьям).
В следующий раз, когда вы спроситевопрос, пожалуйста, включите ваш полный код, включая объявления переменных, такие функции, как test()
и conversion()
и #include
s.Но, пожалуйста, опубликуйте пример, который фокусируется на вашей проблеме под рукой.Весь этот диалог, который вы включили, не был бы необходим.