【问题标题】:How to remove a carriage return from a string in C? [duplicate]如何从C中的字符串中删除回车符? [复制]
【发布时间】:2011-04-17 07:47:31
【问题描述】:

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

你有 C 代码的例子来删除字符串中的回车吗?

【问题讨论】:

  • 到目前为止你有什么?
  • 这是作业吗?当您说“回车”时,您是指仅 0xD,还是换行 (0xA)?
  • 实际上,我不相信所谓的骗子骗子。它专门询问如何用& 替换&amp(尽管标题错误)。当然,答案中有交叉,但这并不一定会使 question 成为骗子。

标签: c string carriage-return


【解决方案1】:

最简单的解决方案可能只是逐个字符地处理字符串,并带有指向源和目标的指针:

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

【讨论】:

  • 这给了我结果“Ti satolnsrn ihDSln nig”。
  • @Fred,我不小心有两个src++ 语句,现在已修复。
  • 如果想法是删除回车并留下换行符,那效果会更好。我不确定 OP 的意图是什么。
  • strlen 返回size_t,因此您应该在printf 中使用'%zu' 格式。
  • schot,您无疑是正确的,但这与问题无关。 printf 只是基础设施,因此您可以测试相关位。你同样可以抱怨我没有提供足够的测试用例。
【解决方案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;
}

【讨论】:

  • 您的替换字符部分正是我想要的。
  • in remove_char_from_string 必须是 i-- 在找到 char 的条件下。否则字符串中连续出现多个字符返回错误结果
猜你喜欢
  • 2011-06-21
  • 2019-04-19
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2014-05-20
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多