1 Востаннє редагувалося Dopamine (20.02.2016 20:16:59)

Тема: char* та знак пробілу

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

Колись використовував просто strchr інакше не працювало.

#include "iostream"

using std::cin;
using std::cout;
using std::endl;

int main()
{
    const short size(23);
    char a[size]; 
    char *b(nullptr);
    char *b2(nullptr);
    short i = 0;
    while (true)
    {
        cin >> a;
        b = a;
        b2 = a;
        while (*(b + i) != (0x20)) /////// '\0' — працює,  '2' — працює, пробіл  - ні
        {
            cout << *(b + i++) <<"\t";
        }

        cout << endl << b << "\t" << b2 << endl;
        i = 0;
    }

    system("pause");
}

2

Re: char* та знак пробілу

У вас саме цей код не працює чи якийсь інший? І що для вас "працює"? Тут, знаєте, з у людей з телепатією проблеми.
Ну і найголовніше: компілятор перетворює ваш код на виконуваний; з введеними символами працює вже не компілятор, а ваш код.
Так, а ще *(b+i) значно краще виглядає як b[i]. Якщо у вас завдання працювати з вказівниками - то збільшуйте b.

3 Востаннє редагувалося Dopamine (20.02.2016 20:36:08)

Re: char* та знак пробілу

koala написав:

У вас саме цей код не працює чи якийсь інший? І що для вас "працює"? Тут, знаєте, з у людей з телепатією проблеми.
Ну і найголовніше: компілятор перетворює ваш код на виконуваний; з введеними символами працює вже не компілятор, а ваш код.
Так, а ще *(b+i) значно краще виглядає як b[i]. Якщо у вас завдання працювати з вказівниками - то збільшуйте b.

рядок 19
цикл while не може знайти в рядку char* b символ пробілу  ' '(він же (0x20)) якщо через cin вводити цей самий рядок у якому є пробіл і тому він зупиняється не адекватно через ~50 циклів при тому, что символ пробілу був раніше

4

Re: char* та знак пробілу

Все працює,

#include <iostream>
using namespace std; 
 
int main()
{
    char a[] = "test_string space"; 
    char *b  = 0;
    char *b2 = 0;
    short i = 0;
    //while (true)
    {
        b  = a;
        b2 = a;
        i  = 0;
        while(b[i] != (0x20) )
            cout << b[i++] <<"\t";
 
        cout << endl << b << "\t" << b2 << endl;
    }
 
    return 0;
}

http://codepad.org/p5IwOJT6

1
2
t    e    s    t    _    s    t    r    i    n    g   
test_string space    test_string space

тут загвоздка у тому що є ввод у циклу, після якого у буфері залишається \n який ніхто не витерає

5 Востаннє редагувалося -=ЮрА=- (20.02.2016 20:42:07)

Re: char* та знак пробілу

Щоб все запрацювало, ось це

cin >> a;
        b = a;

- треба записати ось так

cin >> a;
cin.clear();//скидуємо флаги помилок(якщо є)
cin.sync();//чистимо буфер
 b = a;

6

Re: char* та знак пробілу

-=ЮрА=- написав:

Щоб все запрацювало, ось це

cin >> a;
        b = a;

- треба записати ось так

cin >> a;
cin.clear();//скидуємо флаги помилок(якщо є)
cin.sync();//чистимо буфер
 b = a;

всерівно коли користувач вводить з консолі символи програма не знаходить пробіл

7 Востаннє редагувалося -=ЮрА=- (20.02.2016 20:50:51)

Re: char* та знак пробілу

всерівно коли користувач вводить з консолі символи програма не знаходить пробіл

- це якась басня, проте добре у чому збираєш код?Також хочу зазаначити що на буфер віділено 23 чари, якщо юзер вводить більше можлве UB чи креш

8

Re: char* та знак пробілу

Щось у вас дивне відбувається. У вас часом не японська розкладка? Можете глянути код свого пробіла?
І може припинити писати "не знаходить пробіл", а натомість конкретно писати, що очікуєте і що отримуєте?

9 Востаннє редагувалося -=ЮрА=- (20.02.2016 20:57:47)

Re: char* та знак пробілу

Тьфу дішло - так не можна з пробілами увести cin >> a;

Прихований текст
твою ж дивізію, якже юзери іноді нублять і ти з ними починаєш
#include "iostream"
 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
    const short size(23);
    char a[size]; 
    char *b  = 0;
    char *b2 = 0;
    short i = 0;
    while (true)
    {
        cin.getline(a, 22);
        b  = a;
        b2 = a;
        while (*(b + i) != (0x20)) /////// '\0' — ïðàöþº,  '2' — ïðàöþº, ïðîá³ë  - í³
        {
            cout << *(b + i++) <<"\t";
        }
 
        cout << endl << b << "\t" << b2 << endl;
        i = 0;
    }
 
    system("pause");
}
Post's attachments

Безымянный.png 151.19 kb, 84 downloads since 2016-02-20 

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

10 Востаннє редагувалося -=ЮрА=- (20.02.2016 20:55:59)

Re: char* та знак пробілу

cin.getline(a, 22); - тільки так можно робити вод з пробілами, прямий cin>> (ріже строку по першому ж термінатору/табулятору, яким є пробіл)

Подякували: Dopamine, koala, Yola, leofun014

11

Re: char* та знак пробілу

-=ЮрА=- написав:

cin.getline(a, 22); - тільки так можно робити вод з пробілами, прямий cin>> (ріже строку по першому ж термінатору/табулятору, яким є пробіл)

О богі! Я також про це чув колись, але забув, дякую

12 Востаннє редагувалося -=ЮрА=- (20.02.2016 21:06:05)

Re: char* та знак пробілу

О богі! Я також про це чув колись, але забув, дякую

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

while (*(b + i) != (0x20))

- хочаб так зробіть
while (*(b + i) != (0x20) && *(b + i) )
щоб перевірити мої слова зробіть ввод у вашому коді без спейсів, побачите самі
http://codepad.org/u8NHYchI (той мусор який вивівся буде у реальному житті - segmentation fault)

13

Re: char* та знак пробілу

-=ЮрА=- написав:

О богі! Я також про це чув колись, але забув, дякую

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

while (*(b + i) != (0x20))

- хочаб так зробіть
while (*(b + i) != (0x20) && *(b + i) )
щоб перевірити мої слова зробіть ввод у вашому коді без спейсів, побачите самі
http://codepad.org/u8NHYchI (той мусор який вивівся буде у реальному житті - segmentation fault)

Цей мусор в мене і був коли я вводив через звичайний cin.

14

Re: char* та знак пробілу

Цей мусор в мене і був коли я вводив через звичайний cin.

- друже я тобі сказав як треба зробити щоб не падало у реальних умовах, твоє діло слухати чи не слухати, переконувати я не збираюсь, зазаначу тільки, що той хто знайоми зі строками у плюсах зрозуміє навіщо перевірка на нультермінатор.