如何从C中的字符串中删除回车?

时间:2010-09-26 03:21:57

标签: c string carriage-return

  

可能重复:
  Remove characters from a string in C

您是否有一个C代码示例来删除字符串中的回车?

2 个答案:

答案 0 :(得分:7)

最简单的解决方案是可能只是按字符处理字符串,包含源和目标的指针:

#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的解决方案因为库函数很可能会被优化。

答案 1 :(得分:2)

回车或任何其他字符很容易在字符串中替换,甚至更容易更换。你的问题并没有真正显示你正在寻找的东西所以我已经包含了删除和替换字符串中的字符的示例代码。

#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;
}