1

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

Писав на Паскалі, вирішив спробувати C, поставив Pelles C, трохи розбирався, набралось запитань (я впевнений, що на них є відповідь десь в інтернетах, але я не знайшов).
1. Як я зрозумів, Рядок(String) в C є масивом з певною кількістю символів (Char). Чи завжди потрібно вводити розмір масиву?

char a[256] = "blablabla";

Що відбувається з виділеною пам'яттю, яка не використовується? Можливо дурне запитання. :)
2. Як можна визначити кількість символів в цьому масиві? Тобто кількість елементів цього масиву?
3. Що потрібно зробити, щоб вивести кожен символ окремо в новому рядку (використовуючи for або while)?
4. scanf() - для цілих чисел, а gets() - для символів?
І киньте трохи літератури про C, бажано новішої :)

2

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

так теж можна:

    char a[] = "blablabla";

Що відбувається з виділеною пам'яттю, яка не використовується? Можливо дурне запитання. :)

Виділена пам’ять для локальної змінної знищується після звершення роботи функції, а виділена пам’ять функцією malloc чи подібною просто не використовується.

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

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

3. Що потрібно зробити, щоб вивести кожен символ окремо в новому рядку (використовуючи for або while)?

тіло циклу:

printf("%c\n", c);

4. scanf() - для цілих чисел, а gets() - для символів?

scanf для всього, лише треба специфікатори підібрати

І киньте трохи літератури про C, бажано новішої :)

Стівен Пратта вам у руки

Подякували: koala, doh, Kane, leofun014

3

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

1. Якщо не вводити, то треба одразу ініціалізувати:

char a[] = "blablabla";//sizeof(a)==10 - довжина рядка і '\0' наприкінці

Якщо довжина більша, то далі в пам'яті буде сміття - те, що там було до виділення.
2. Оператор sizeof повертає розмір в байтах. Функція strlen - кількість символів до нульового.
3. Вивести кожен символ окремо в новому рядку (використовуючи for або while) - К.О.
4. scanf - для форматованого вводу, gets - для рядків.

Подякували: doh, leofun012

4

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

Класичний підручник по С, від авторів мови. От
Сам колись з паскаля\делфі на С++ переходив.
Не лякайтесь що не відразу зрозумієте вказівників, рухайтесь далі, практикуйтесь, потім дійде
Поставте краще Visual Studio бо вам знадобиться хороший дебагер

Подякували: doh1

5

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

Visual Studio це стандарт інтегрованого середовища розробки для С, тож з ним все одно доведеться познайомитися, має безкоштовну версію, яка з задовільнить всі ваші потреби, але воно мені огидне.

Подякували: Kane1

6

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

printf("%c\n", c);
#include <stdio.h>

int main(void) {
    int i;
    char c[]= "abc";
    for (i = 0; i < 3; i++) {
        printf("%c\n", c);
    }
    return 0;
}

Виводить L L L.
Я розумію, що очевидно про while та for, але є одне але.
Яким чином вивести a[і]?

7

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

так воно і пишеться - a[і]

Подякували: koala, doh2

8

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

printf("%c\n", c[i]);

нє?

Подякували: doh1

9 Востаннє редагувалося doh (08.02.2015 22:04:18)

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

0xDADA11C7 написав:

так воно і пишеться - a[і]

Прошу вибачення, не додумався потестувати перед тим, як писати :)
Так, все працює.

10

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

#include <stdio.h>

int main(void) {
    int i;
    char c[256];
    gets(c);
    for (i = 0; i < strlen(c); i++) {
        printf("%c ", c[i]);
    }
    return 0;
}

Чи все добре тут?
hello.c(6): warning #2018: Undeclared function 'gets'; assuming 'extern' returning 'int'.
hello.c(7): warning #2018: Undeclared function 'strlen'; assuming 'extern' returning 'int'.
Програма працює, але ці попередження?

11

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

Підключіть

#include <stdlib.h>
Подякували: doh1

12

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

0xDADA11C7 написав:

Підключіть

#include <stdlib.h>

Нічого не змінилось.

13

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

Project -> Project Options -> Compiler -> C Standard = C-99

В останній версії стандарту сів - С11 функцію gets прибрали, тому увімкніть стандарт С99.

Подякували: doh1

14

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

Це мабуть якийсь жарт :)
hello.c(7): warning #2241: The function 'gets' is marked as deprecated.
hello.c(8): warning #2018: Undeclared function 'strlen'; assuming 'extern' returning 'int'.

15 Востаннє редагувалося koala (08.02.2015 22:32:01)

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

Треба повідомити компілятору, що це за функції:

extern char * gets ( char * str );
extern unsigned strlen ( char * str );
Подякували: doh1

16

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

koala написав:

Треба повідомити компілятору, що це за функції:

extern char * gets ( char * str );
extern unsigned strlen ( char * str );

Дякую, попередження зникли. Чи це впливає якимось чином на програму?

17

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

koala написав:

Треба повідомити компілятору, що це за функції:

extern char * gets ( char * str );
extern unsigned strlen ( char * str );

А stdio.h нащо? Так, ці функція застаріла, а зараз використовується fgets. Макрос що емулює gets виглядає приблизно так:

#define gets(string)  fgets(string, stdin)

18

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

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

5.1.1.2 The functions, macros, and types defined in Clause 5 and its subclauses are defined by their respective headers if __STDC_WANT_LIB_EXT2__ is defined as a macro which expands to the integer constant 1 at the point in the source file where the appropriate header is included.

http://www.open-std.org/jtc1/sc22/wg14/ … /n1248.pdf
Тобто перед #include треба додати рядок

#define __STDC_WANT_LIB_EXT2__ 1

Ось такі цікавинки...

Подякували: leofun011

19

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

0xDADA11C7 написав:

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

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

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

20 Востаннє редагувалося reverse2500 (09.02.2015 07:00:10)

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

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

scanf("%s", &strichka);

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