Что делает char * p = int? C ++ - PullRequest
       5

Что делает char * p = int? C ++

0 голосов
/ 08 апреля 2020

Я немного поиграл со строками, и я столкнулся с такой ситуацией, идея состоит в том, чтобы удалить пробелы в слове s2, и я просто поставил число 1, и оно просто работает. мне не понятно почему. что здесь произошло и что происходит в памяти? Это действительно хорошее решение?

  char s2[]= " wo rl  d";
    char *h = s2;
    while(*h != '\0'){
        if(*h == ' '){
            *h=1;
        }
        h++;
    }
    printf("%s",s2);

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

1 в таблице ASCII - непечатаемый символ (начало заголовка - SOH). При его печати ваша программа просто пропустит их (ну, вероятно, ASCII не гарантируется ни в одной программе C ++).

что происходит в памяти?

В памяти у вас все еще есть эти 1 в каждом месте.
Это выглядит так:

1   119 111 1   114 108 1   1   100 0       // decimal values, assuming ASCII
SOH w   o   SOH r   l   SOH SOH d   NUL     // char representations

Это действительно хорошее решение?

Не совсем. char 1 может печататься по-разному в некоторых системах. strlen() вернет всю длину строки, включая эти символы SOH, а не количество напечатанных символов (что можно ожидать). Итерация по этой строке даст странные значения. В целом, работа с этой строкой позже будет беспорядком.
Пока это работает, но вам, вероятно, следует действительно удалить символы вместо того, чтобы просто заменить их непечатаемыми.

1 голос
/ 08 апреля 2020

Вы устанавливаете значение всех char s в s2, которые являются пробелом для значения 1, которое SOH в ASCII, непечатный символ (отметьте this site для таблицы всех значений ASCII). (*h разыменовывает указатель, позволяя вам изменить значение char, на которое он указывает, и int s может быть неявно приведено к char).

Это, конечно, не очень чистый решение, так как вы тратите пространство с непечатным char. Возможно, сделайте это вместо:

std::string = "wo rl d";
remove_if(str.begin(), str.end(), isspace);
...