C запятая является целым числом в scanf

#c #scanf

Вопрос:

Приведенный ниже код просит пользователя ввести номер, за которым следует оператор. Это работает до тех пор, пока не используются запятые. Например,

Счастливого пути

 6000 2000 will output 6000.000   2000.000 
 

Неожиданный результат

 6,000 2,000 will output 6.000 , 0.000
 

Может ли scanf каким-то образом обрабатывать значение как плавающее при использовании запятой?

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

int main(int argc, char *argv[]) 
{
    char operatorFound;
    float num1,num2, calcValue;
    printf("Please enter a simple expression (ie: 2 2):" );
    scanf("%f%c%f", amp;num1, amp;operatorFound, amp;num2);
    printf("%fn%cn%f", num1, operatorFound, num2); 
   return 0;
}
 

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

1. scanf ничего для тебя не сделает. Вы застряли, читая строки, выполняя проход, чтобы проверить формат и/или исправить строку, а затем используйте sscanf для анализа фиксированной строки.

2. Да, запятые будут разбивать целочисленные поля scanf . Если вы хотите анализировать целочисленные форматы, которые включают разделительные запятые, вам нужно что-то еще или, по крайней мере, что-то дополнительное.

3. Изменить языковой стандарт, scanf() , восстановить языковой стандарт

4. В вашей стране (или стране (локали), установленной на вашем компьютере) ожидается точка в качестве десятичной точки и запятая в качестве разделителя. В некоторых других странах, таких как Германия, принято поступать наоборот. Поскольку это явно пользовательский интерфейс, он должен соответствовать локали пользователя, а не разработчика, поэтому scanf отлично справляется с этой задачей.

Ответ №1:

Возможно, можно настроить scanf под Linux, установив соответствующий языковой стандарт. См. Документацию scanf Linux

Для десятичных преобразований необязательный символ кавычки (‘). Это указывает, что входное число может включать разделители тысяч, определенные категорией LC_NUMERIC текущего языка. (См. setlocale(3).) Символ кавычки может предшествовать или следовать за символом подавления присвоения»*».

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

int main(int argc, char *argv[]) 
{
    char operatorFound;
    float num1, num2, calcValue;
    // Use en_US.UTF-8 to separate groups of thousands, many other countries use a period instead, and some countries separate thousands groups with a space
    setlocale(LC_NUMERIC, "en_US.UTF-8");
    puts("Please enter a simple expression (ie: 2 2):" );
    
    // Notice the use of a single quote
    if (scanf("%'f %c%'f", amp;num1, amp;operatorFound, amp;num2) == 3) { 
        printf("%fn%cn%f", num1, operatorFound, num2); 
    } else {
        puts("Unable to process input");
    }
   return 0;
}
 

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

1. Может также предложить "%'f %c%'f" разместить пробелы вокруг оператора.

2. символ кавычки (‘) является нестандартным расширением C для *scanf() . Не в C17, C11 и т. Д.

3. Просто посмотрел это, а не стандарт ISO C, C11 — 7.21.6.2 Функция fscanf

4. Попробовал, у меня ничего не вышло. Все то же самое

5. да, это мой компилятор, я пробовал с linux gcc, и он работает

Ответ №2:

Во время сканирования ввода C принимает запятые как символ.

Если вы введете только 6,00 , он все равно напечатает 6,000, 0,000, потому что в качестве второго ввода используется запятая.

Поэтому вы должны использовать точки». » для поплавков

Ответ №3:

Итак, после тестирования. Я обнаружил, что мой компилятор неисправен. Когда я тестировал на Linux GCC, все ответы работали.

Если я войду

6000 2000 он выведет 8000

6000 2000 он выведет 8000

6000 2000 он выведет 8000

6000 2000 он выведет 8000

6000 2000 он выведет 8000

и т. д. и т. д.

Спасибо всем вам за то, что изучили это и помогли мне