21 Востаннє редагувалося koala (09.02.2015 06:57:05)

Re: Запитання нуба, який сьогодні познайомився з C.

P.Y. написав:
0xDADA11C7 написав:

2. Як можна визначити кількість символів в цьому масиві? Тобто кількість елементів цього масиву?

sizeof(array)/sizeof(array[0])

Це тільки якщо array описано як масив фіксованої розмірності (описаний як тип array[число]). Якщо ж це масив невизначеного розміру (описаний як тип array[] чи тип *array), такий метод не годиться. В загальному випадку, розмір невідомий (що дає нам додаткові можливості прострелити собі ногу). У випадку рядка символів, можна застосувати функцію strlen(array), яка знайде кількість символів до кінцевого нуль-символа, що відмічає закінчення рядка.

В C немає понять "масив фіксованої розмірності" і "масив невизначеного розміру". Тут питання в тому, в який момент sizeof визначає розмір - це відбувається під час компіляції, а не під час виконання. тип *array - це вказівник на масив. Параметр функції тип array[] (а чи навіть тип array[розмір]) - це теж вказівник. А от змінна чи елемент структури тип array[] мають розмір, визначений компілятором, тому

char array[] = "bla";
printf("%d",sizeof(array)/sizeof(array[0]));

спокійно надрукує собі 4.

Ну і strlen іде до нуля, тому якщо прибрати нуль з рядка, може залізти далеко за область пам'яті, де починався масив, доки інший нуль не зустрінеться...

22

Re: Запитання нуба, який сьогодні познайомився з C.

reverse2500 написав:

коли пишеш з gets програму, то іноді вона викидає попередження, смисл якого, там є функція gets, вона небезпечна і можна у вашій програмі переповнити буфер.
scanf() - для вводу з форматуванням типу

scanf("%s", &strichka);

getc() - для символа

А якщо рядок містить пробіл?

23

Re: Запитання нуба, який сьогодні познайомився з C.

doh написав:
reverse2500 написав:

коли пишеш з gets програму, то іноді вона викидає попередження, смисл якого, там є функція gets, вона небезпечна і можна у вашій програмі переповнити буфер.
scanf() - для вводу з форматуванням типу

scanf("%s", &strichka);

getc() - для символа

А якщо рядок містить пробіл?

Вже сказали:

fgets(string, sizeof(string)/*чи іншим чином визначена довжина*/, stdin);


Власне, небезпека полягає саме в читання за межі рядка - fgets читає тільки визначену кількість символів.
А ще можна робити

scanf("%[^\n]s",string);

але краще, якщо не розбираєте рядок на токени, читати його fgets-ом.

24

Re: Запитання нуба, який сьогодні познайомився з C.

http://i64.сайт-злодій/big/2015/0209/39/ce8187c5dc5889fc5daec039da0f1339.png
"Стивен Прата - Язык программирования C. Лекции и упражнения (5-е издание) - 2013" - https://www.sendspace.com/file/w0lq3m

Щодо компіляторів, то тут без різниці на перших етапах. Це вже потім, коли бавишся з ключами, починаєш помічати якість згенерованого. Наприклад:

func(0, 0, 0);

Один робить так:

mov eax, 0
push eax
mov eax, 0
push eax
mov eax, 0
push eax
call func

а другий так:

xor eax, eax
push eax
push eax
push eax
call func

і т.д.
pelles c - легкий, простий, функціональний, ну і генерує непогано.

У студії доволі гарний компілятор, хоча і туго впроваджує підтримку стандарту самої мови. Ну і це єдина "нормальна" IDE під win, в якій зручно робити великі проекти. Глюки, місцями не зовсім інтерактивно.. ну, згодиться, якщо дуже треба)) Для ще більшої зручності, можете встановити visual assist, та ще добрий десяток плагінів.
Ну або іще як варіант, ставите якийсь сторонній редактор (наприклад sublime text), і вручну, під себе його ліпите, створюєте bat'ники для компіляції та лінкування і т.д.

Подякували: 0xDADA11C71