Вопрос по Си


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 085
Репутация
8 208
По мойму в gcc нет, дело в том-что если не ошибаюсь, то uint и другие целочисленные типы фиксированного размера появились только в стандарте C99 (это обычный Си, который без плюсов). Так что в C++ (по крайней мере согласно текущему стандарту) этих типов может и не быть.

Нужно смотреть стандарт и документацию к компилятору, а вообще в чем принципиальность вопроса ? Неразу не видел uint для main, обычно ставят int или void. Лучше ставить int это подойдет под любой компилятор...
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 085
Репутация
8 208
uint я называю unsigned int например я часто для упрощения создаю свой тип данных, пример:

typedef uint unsigned int

Далее можно использовать uint, так проще...
 

Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3
Парни объясните почему функция strlen не правильно выдает значение количества букв ?
Вот пример
Код:
#include <stdio.h>
#include <string.h>
#define PRIVETSTVIE "Здравствуйте !"

int spasibo ();
int main ()

{
    float chek ,zdacha ;
    int svoi ;
    printf("%s \n" ,PRIVETSTVIE);
    printf("У вас по чеку \n");
    scanf("%f", &chek);
    printf("Сколько у вас наличных ? \n");
    scanf("%d", &svoi);
    zdacha = svoi - chek ;
    printf("Теперь посчитаем какая у вас получилась сдача %d - %.2f = %.2f \n\n", svoi ,chek ,zdacha);
    printf("Давайте теперь посчитаем сколько ,в слове приветствия букв %zd \n\n",strlen(PRIVETSTVIE) );
    spasibo();
    return 0;
}
int spasibo ()
{
    printf("Спасибо за покупку ! \n");
    printf("Приходите еще !");
    return 0;
}
,а вот вывод программы
Код:
Здравствуйте !
У вас по чеку
3456.48
Сколько у вас наличных ?
5000
Теперь посчитаем какая у вас получилась сдача 5000 - 3456.48 = 1543.52

Давайте теперь посчитаем сколько ,в слове приветствия букв 26

Спасибо за покупку !
Приходите еще !
Process finished with exit code 0
 
Последнее редактирование:

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
Парни объясните почему функция strlen не правильно выдает значение количества букв ?
Спецификатор размера z уберите в printf, скорей-всего дело в нём...

Т.е. попробуйте так:
Код:
printf("Давайте теперь посчитаем сколько ,в слове приветствия букв %d \n\n",strlen(PRIVETSTVIE) );
Также у вас константная строка, объявленная дефайном, в таком случае можно применить sizeof, этот оператор используется для определения размера памяти используемой переменной !

В других случаях sizeof для определения длины строки применять не рекомендуется...

Да и вообще какой смысл использовать дефайн для строки, я-бы объявил так:
Код:
char *PRIVETSTVIE = "Здравствуйте !";
Далее уже и работал-бы с ней, не люблю заморочки в коде ! :(
 

Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3
Вот если убрать z из
Код:
printf("Давайте теперь посчитаем сколько ,в слове приветствия букв %zd \n\n",strlen(PRIVETSTVIE) );
То будет тоже значение ,что и раньше ,и компилятор выдаст предупреждение ,что не верный спецификатор ,так как спецификатор %z для функции strlen !
И что означает звездочка перед PRIVETSTVIE ?
Код:
char *PRIVETSTVIE = "Здравствуйте !";
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
То будет тоже значение ,что и раньше ,и компилятор выдаст предупреждение ,что не верный спецификатор ,так как спецификатор %z для функции strlen !
Ну значит дело в дефайне, дефайн - Это препроцессорная директива, осуществляющая замену на этапе компиляции, хз., как там преобразовал компилятор, поэтому попробуйте заменить так:
Код:
const char *PRIVETSTVIE = "Здравствуйте !";
И что означает звездочка перед PRIVETSTVIE ?
Это указатель на первый эллемент строки, строка это по сути массив символов char (Один байт).
Именно так в си объявляются массивы, можно ещё объявить так:
Код:
char PRIVETSTVIE[100] = "Здравствуйте !";

100 - В данном случае, это максимальный размер массива, если строка будет больше ста символов, то выведет ошибку, поэтому через указатель объявлять лучше в тех случаях, когда неизвестно какой массив будет по размеру !
 

Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3

Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3
Я вообще ничего понять не могу
Код:
#include <stdio.h>
#include <string.h>

int spasibo ();
int main ()

{
    float chek ,zdacha ;
    int svoi ;
    char const PRIVETSTVIE[30] = "Здравствуйте !";
    printf("%s \n" ,PRIVETSTVIE);
    printf("У вас по чеку \n");
    scanf("%f", &chek);
    printf("Сколько у вас наличных ? \n");
    scanf("%d", &svoi);
    zdacha = svoi - chek ;
    printf("Теперь посчитаем какая у вас получилась здача %d - %.2f = %.2f \n\n", svoi ,chek ,zdacha);
    printf("Давайте теперь посчитаем сколько ,в слове приветсвия букв %zd \n\n",strlen(PRIVETSTVIE) );
    spasibo();
    return 0;
}
int spasibo ()
{
    printf("Спасибо за покупку ! \n");
    printf("Приходите еще !");
    return 0;
}
,почему даже напрямую через константу, а не через #define ( константу ) ,происходит тоже самое ?
Вывод программы
Код:
Здравствуйте !
У вас по чеку
3456.66
Сколько у вас наличных ?
5000
Теперь посчитаем какая у вас получилась здача 5000 - 3456.66 = 1543.34

Давайте теперь посчитаем сколько ,в слове приветсвия букв 26

Спасибо за покупку !
Приходите еще !
Process finished with exit code 0
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
почему даже напрямую через константу, а не через #define ( константу ) ,происходит тоже самое ?
Ну-да русские символы в utf8 (если ваши исходники в utf8) кодируются не одним байтом, а двумя ! :(

Попробуйте написать латиницей для проверки !:)
 

Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3
Ну-да русские символы в utf8 (если ваши исходники в utf8) кодируются не одним байтом, а двумя ! :(
Огромное человеческое Вам спасибо за помощь !
Все получилось ,это что получается в utf8 2 байта одна буква ,а не как в латинице 1 байт
 
Последнее редактирование:
Верх Низ