1

Тема: Масиви символів C. Пошук символа в масиві.

Потрібна допомога. Задана не порожня послідовність не порожніх слів із латинських букв; сусідні слова відділяються; одне від другого комами, а за останнім словом є крапка. Визначити слова, які містять хоча би одну букву d. Не можу знайти помилку в коді.

#include <stdio.h>
 
int main()
{
 
    char* arr = "God,love,snowl,rod,lord,pod,cold.";
 
    char *start = arr;
    while (arr)
    {
        if (*arr == ',' || *arr == '.')
        {
            if (*arr == 'd')
            {
                for (; start != arr; printf("%c", *start), start++);
 
                printf("\n");
            }
            if (*arr == '.') break;
            start = arr + 1;
        }
        arr++;
    }
 
    system("pause");
    return 0;
}

2

Re: Масиви символів C. Пошук символа в масиві.

Не зрозумів логіку. Умова

while(arr)

взагалі завжди виконується (там 0 ніколи не виникне). А як, на вашу думку, має працювати цей блок?

if (*arr == ',' || *arr == '.')//якщо *arr буде 'd', то ця умова не виконається
        {
            if (*arr == 'd')//сюди з *arr=='d' ми ніколи не потрапимо

Ну а

for (; start != arr; printf("%c", *start), start++);

взагалі схоже на творіння хакера 70-х років. Хоча б printf винесіть в тіло цикла.

І спробуйте записати словами, як має працювати ваша програма.

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

3

Re: Масиви символів C. Пошук символа в масиві.

Ось так шукає всі d в масиві, а як вивести слова які містять їх.

#include <stdio.h>
int main()
{

    char* arr = "God,love,snowl,rod,lord,pod,cold.";

    char *start = arr;
    while (arr != '.')
    {
            if (*arr == 'd')
            {
                for (; start != arr; start++);
                printf("%c", *start),
                printf("\n");
            }
            if (*arr == '.') break;
            start = arr + 1;
        arr++;
    }

    system("pause");
    return 0;
}

Я просто тільки почав вивчати С/C++, тому звертаюсь за допомогою.

4

Re: Масиви символів C. Пошук символа в масиві.

Так ви ніколи не вивчите, по шматках чужого коду. Опишіть словами алгоритм, як саме має працювати ваша програма.
І "мови C/C++" не існує. Це дві окремі мови, просто частково сумісні, тому іноді пишуть "в C/C++", коли щось одночасно вірно і для C, і для C++. Але вчити їх можна тільки по одній.

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

5 Востаннє редагувалося tasina009 (23.11.2016 21:59:50)

Re: Масиви символів C. Пошук символа в масиві.

Спочатку потрібно пройтись по масиву і знайти букви "d". Потім вивести слова від коми до коми, в яких є ця буква. Ну так я їх окремо вивчаю.

6

Re: Масиви символів C. Пошук символа в масиві.

Чудово, тепер лишилося це записати мовою C. Я вам допоможу:

char str[] = "God,love,snowl,rod,lord,pod,cold.";
int i;
int len = strlen(str);
for(i=0;i<len;++i)//ідемо по стрічці
{
  if(str[i]=='d')//знаходимо букви 'd'
  {
    //ось в цьому місці ми маємо вивести слово від коми до коми
  }
}

Тепер питання: як ви будете виводити слово, в якому знаходиться відома нам літера під номером i, від коми до коми?

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

7 Востаннє редагувалося tasina009 (23.11.2016 23:31:54)

Re: Масиви символів C. Пошук символа в масиві.

Записавши два цикли, один з яких буде виводити всі букви вправо від 'd' до коми або крапки, а другий вліво від 'd' до коми або першой букви масиву?

8

Re: Масиви символів C. Пошук символа в масиві.

Саме так.
Звісно, алгоритм неоптимальний - зате він ваш. Пишіть.

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

9

Re: Масиви символів C. Пошук символа в масиві.

а яким чином буде найоптимальніше? я використаю свій, але чи не могли б ви підказати на майбутнє?

10

Re: Масиви символів C. Пошук символа в масиві.

Проходите по вхідному масиву посимвольно, виділяючи підрядок (обмежений початком вхідного рядка, або комою чи крапкою, - крапка (чи кома) в кінці обов'язкова), і рахуєте в підрядку кількість 'd' символів. Щойно натрапляєте на новий підрядок (тобто стикаєтесь з комою чи крапкою у вхідному рядку), дивитесь, якшо в попередньому підрядку кількість символів 'd' більша нуля, друкуєте його, налаштовуєте початок наступного підрядка і скидаєте лічильник 'd' символів. Так ви матиме відстеження підрядка і його статус придатности для друкування (begin - початок підрядка, (i - 1) - кінець підрядка, Dcount - параметр придатности підрядка для друку).
Код нижче не розрізняє крапку і кому, тож крапка всередині чи кома в кінці вхідного рядка всеодно працюватимуть. Для розірзнення треба внести незначні зміни. ;)

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

char str[] = "God,love,snowl,rod,lord,pod,cold.";

int main(int argc, char **argv){
    int i, j, begin, Dcount, len;
    char *Buf;

    Buf = argc == 2 ? *(argv + 1) : str;
    len = strlen(Buf);
    begin = 0;
    Dcount = 0;
    for(i = 0; i < len; ++i)
        switch(*(Buf + i)){
            case ',':
            case '.':
                if(Dcount){
                    printf("'d' has been encountered %d times here:\t", Dcount);
                    for(j = begin; j < i; j++)putc(*(Buf + j), stdout);
                    putc(0x0a, stdout);
                    Dcount = 0;
                }
                begin = i + 1;
                break;
            case 'd': Dcount++; break;
        }

    return 0;
}
B16B00B5
Подякували: tasina0091

11

Re: Масиви символів C. Пошук символа в масиві.

Скажіть, будь ласка, а в чому сакральний сенс писати *(Buf + i) замість Buf[ i ]? Отримання задоволення від думки "а я так можу"?
І краще все ж putchar, якщо вивід іде в stdout. Так само як '\n' краще за 0x0a, коли йдеться про символи.

12

Re: Масиви символів C. Пошук символа в масиві.

Чому б не використати ф-ції для роботи зі строками з crt ?

13

Re: Масиви символів C. Пошук символа в масиві.

Ви про https://en.wikipedia.org/wiki/Cathode_ray_tube?

14

Re: Масиви символів C. Пошук символа в масиві.

koala написав:

Ви про https://en.wikipedia.org/wiki/Cathode_ray_tube?

а що в цій гілці форуму обговорюють залізо?

15

Re: Масиви символів C. Пошук символа в масиві.

cheappi386 написав:
koala написав:

Ви про https://en.wikipedia.org/wiki/Cathode_ray_tube?

а що в цій гілці форуму обговорюють залізо?

Так, ви.

16

Re: Масиви символів C. Пошук символа в масиві.

koala написав:

Скажіть, будь ласка, а в чому сакральний сенс писати *(Buf + i) замість Buf[ i ]? Отримання задоволення від думки "а я так можу"?

Не перебільшуйте, це просто питання смаку. Так навчили. І тепер мені так просто подобається більше. Ніяких понтів. Це синтаксично ідентичні методи. Практична вигода від форми яку я використав - вона краще допомагає на початках розібратися з вказівниками. По ній наглядніше видно як воно працює. А далі - це вже звичка. До того ж, вивчення всіх варіантів теж допомагає глибше розуміти мову.

І краще все ж putchar, якщо вивід іде в stdout. Так само як '\n' краще за 0x0a, коли йдеться про символи.

Немає жодної різниці, хоч власноруч написаним printf'ом. І шодо 0x0a, - так само, дивіться, використовуючи одне \n можна з часом і забути, шо там за ним.

B16B00B5

17

Re: Масиви символів C. Пошук символа в масиві.

koala написав:
cheappi386 написав:
koala написав:

Ви про https://en.wikipedia.org/wiki/Cathode_ray_tube?

а що в цій гілці форуму обговорюють залізо?

Так, ви.

Це лише мені здається, чи справді тут пахне уніксовіндовим срачем? :D
для бздунів, галімуксу і решти слюніксподібних- це дурне libc, для адептів Вінди нормальних людей це crt. :)

B16B00B5