Обрабатывать ввод от пользователя в C сложно. Просто разберитесь с этим, если вы полны решимости закодировать программу, которая запрашивает ввод пользователя на языке C.
В реальном мире, где вы пытаетесь решить реальную проблему с помощью своего кода, а не просто выполняете упражнения по изучению языка, вы не будете иметь дело с подобными вещами в C, если это не очень незначительная вещь в код. Вместо этого вы должны использовать такой язык, как Python, для таких задач.
По сути, по той же причине вы не слишком много знаете о том, как программировать эффективные умножения матриц для больших матриц в Python. Если вам действительно нужно сделать это в вашей программе на Python (и вы по каким-то причинам не можете использовать существующие библиотеки), ответом будет код модуля C и его импорт в Python.
Существуют способы уменьшить головную боль, по крайней мере, на 90% или другое произвольно большое число, которое меньше 99, следуя этим рекомендациям: Всякий раз, когда вы хотите что-то прочитать от пользователя, читайте целую строку. Не используйте scanf
. Используйте fgets
, чтобы прочитать всю строку, а затем обработайте ее с помощью sscanf
. И также не забывайте всегда проверять возвращаемое значение. Вот пример:
#define bsize = 100;
char buffer[bsize];
int x,y;
float f, g;
int r;
printf("Enter two integers: ");
fflush(stdout); // Make sure the printf is executed before reading
if(! fgets(buffer, bsize, stdin)) {
fprintf(stderr, "An error occured\n");
exit(1);
}
if((r = sscanf(buffer, "%d%d", &x, &y)) != 2) {
fprintf(stderr, "An error occured. You entered:\n%s\n" buffer);
fprintf(stderr, "%d successful conversions", r);
exit(1);
}
printf("Enter a float and a char: ");
fflush(stdout);
if(! fgets(buffer, bsize, stdin)) {
fprintf(stderr, "An error occured\n");
exit(1);
}
if((r = sscanf(buffer, "%f%f", &f, &g)) != 2) {
fprintf(stderr, "An error occured. You entered:\n%s\n" buffer);
fprintf(stderr, "%d successful conversions", r );
exit(1);
}
printf("You entered %d %d %f %f\n", x, y, f, g);
Это часто излишне, и код становится довольно большим, но метод чтения строки сначала, а затем ее обработки значительно облегчает отладку в большинстве случаев. Кроме того, это избавляет вас от головной боли при очистке входного буфера. Я мог бы упомянуть, что fflush(stdin)
- неопределенное поведение, поэтому не используйте его.
Я также хочу отметить, что fgets
поместит символ новой строки в буфер, так что вы можете удалить его. Один из способов это сделать buffer[strcspn(buffer, "\n")] = 0