Как удалить возврат каретки из строки в C?

Возможный дубликат:
удаление символов из строки в С

У вас есть пример кода C для удаления возврата каретки в строке?


person syedmuhd    schedule 26.09.2010    source источник
comment
что у вас есть до сих пор?   -  person AndersK    schedule 26.09.2010
comment
Это домашнее задание? И когда вы говорите возврат каретки, вы имеете в виду только 0xD или переводы строки (0xA)?   -  person egrunin    schedule 26.09.2010
comment
На самом деле, я не уверен, что предполагаемый обман является обманом. Он специально спрашивал, как заменить &amp на & (несмотря на ошибочное название). Конечно, в ответах есть пересечения, но это не обязательно делает вопрос обманом.   -  person paxdiablo    schedule 26.09.2010


Ответы (2)


Самое простое решение, вероятно, состоит в том, чтобы просто обработать строку символ за символом с указателями на источник и место назначения:

#include <stdio.h>
#include <string.h>
int main (void) {
    char str[] = "This is a two-line\r\nstring with DOS line endings.\r\n";
    printf("%d [%s]\n",strlen(str), str);

    // ========================
    // Relevant code in this section.
    char *src, *dst;
    for (src = dst = str; *src != '\0'; src++) {
        *dst = *src;
        if (*dst != '\r') dst++;
    }
    *dst = '\0';
    // ========================

    printf("%d [%s]\n",strlen(str), str);
}

Это устанавливает два указателя изначально одинаковыми. Затем он копирует символ и всегда перемещает указатель источника. Однако он продвигает указатель назначения только в том случае, если символ не был возвратом каретки. Таким образом, все возвраты каретки перезаписываются либо следующим символом, либо завершающим нулем. Результат:

51 [This is a two-line
string with DOS line endings.
]
49 [This is a two-line
string with DOS line endings.
]

Этого будет достаточно для большинства строк. Если ваши строки действительно огромны по размеру (или вам нужно делать это много раз в секунду), вы можете рассмотреть решение на основе strchr, так как библиотечная функция скорее всего будут оптимизированы.

person paxdiablo    schedule 26.09.2010
comment
Это дает мне результат Ti satolnsrn ihDSln nig. - person Fred Larson; 26.09.2010
comment
@Fred, у меня случайно было два оператора src++, которые сейчас исправлены. - person paxdiablo; 26.09.2010
comment
Это работает лучше, если идея состоит в том, чтобы удалить возврат каретки и оставить символы новой строки. Я не уверен, каково намерение ОП. - person Fred Larson; 26.09.2010
comment
strlen возвращает size_t, поэтому вы должны использовать формат '%zu' в printf. - person schot; 26.09.2010
comment
Шот, ты, без сомнения, прав, но это не имеет отношения к вопросу. printf была просто инфраструктурой, чтобы можно было протестировать соответствующий бит. Вы также можете жаловаться, что я не предоставил достаточно тестовых случаев. - person paxdiablo; 26.09.2010
comment
@paxdiablo, я знаю, и твой ответ в порядке (+1). Но с каждым фрагментом кода, который вы публикуете, вы подаете пример. Я бы в равной степени пожаловался на void main() :) - person schot; 27.09.2010

Возврат каретки или любой другой символ легко заменить в строке и еще проще заменить. Ваш вопрос на самом деле не показывает, что вы ищете, поэтому я включил пример кода для удаления и замены символа в строке.

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

void remove_char_from_string(char c, char *str)
{
    int i=0;
    int len = strlen(str)+1;

    for(i=0; i<len; i++)
    {
        if(str[i] == c)
        {
            // Move all the char following the char "c" by one to the left.
            strncpy(&str[i],&str[i+1],len-i);
        }
    }
}

void replace_char_from_string(char from, char to, char *str)
{
    int i = 0;
    int len = strlen(str)+1;

    for(i=0; i<len; i++)
    {
        if(str[i] == from)
        {
            str[i] = to;
        }
    }
}

int main(void) {
    char *original = "a\nmultiline\nstring";
    int original_len = strlen(original)+1;

    char *string = (char *)malloc(original_len);
    memset(string,0,original_len);
    strncpy(string,original,original_len);

    replace_char_from_string('\n',' ',string);
    printf("String: %s\n",string); // print: String: a multiline string

    remove_char_from_string(' ',string);
    printf("String: %s\n",string); // print: String: amultilinestring

    return 0;
}
person Pierre-Luc Simard    schedule 26.09.2010
comment
Ваш раздел замены персонажа был именно тем, что я искал. - person Westrock; 23.02.2015
comment
в remove_char_from_string должно быть i-- в условии, когда char найден. В противном случае многократное вхождение char последовательно в строке возвращает неверный результат. - person Peter; 21.07.2015