转换换行符

时间:2013-02-10 05:02:52

标签: c

我正在尝试将新行字符\ n转换为dos样式,即\ r \ n,而不使用libc。

这是我的尝试,我做错了什么?

       for(i = 0; str[i]!='\0'; ++i)
{
   if ('\r' == str[i] && '\n'==str[i+1]) 
       ++count;
}

strPtr = malloc(i + 1 + count);

for(i = j = 0; str[i]!='\0'; ++i)
{
   if ('\r' == str[i]) 
   strPtr[j++] = "";
}

strPtr[j] = 0;
现在应该输出

“嗨\ r \ n,你好吗\ r \ n,你还好吗\ r \ n”

4 个答案:

答案 0 :(得分:4)

这里有很多问题。首先,您使用原始缓冲区修改字符串到位。但是,原始缓冲区没有足够的空间来存储其他\r个字符。您需要分配更大的缓冲区。

其次,UNIX样式的回车符不会存储为两个单独的\n个字符。它是单个ASCII字符,值为0xA,可以使用转义序列\n表示。因此,要检查当前字符是否为换行符,您要说strPtr[i] == '\n'

最后,当您说strPtr[i-1] = '\r'时,您正在覆盖旧缓冲区。这将替换 \n之前的字符(例如i中的Hi)。

基本上,您要做的是为输出创建第二个缓冲区,并将字符串逐字符复制到输出缓冲区。当您遇到\n字符时,不要将单个\n复制到新缓冲区,而是复制\r\n

输出缓冲区的大小需要是输入缓冲区大小的两倍,以处理输入字符串的情况,其中每个字符为\n,加上NULL终结符为1。但是,您可以通过预先计算原始字符串中\n个字符的数量来计算输出缓冲区的最佳大小。

答案 1 :(得分:1)

C语言中的所有转义序列字符都只存储在一个字节的内存中,不要将其视为两个字符。

因此,当您检查\n时,可以直接检查\0的字节。

如果要将\n(1个字符)替换为\r\n(2个字符),则str应该有额外的内存,但在程序中它没有额外的内存。< / p>

char *a = "\n"; //This is one byte
char *b = "\\\n"; //This is two byte, 1st byte for '\' and 2nd byte for new line
char *c = "\\\r\n"; //Similarly this is three byte
char *c = "\r\n"; //Similarly this is two byte

以下所有转义序列字符都是C语言中的单字节字符。

\n – New line
\r – Carriage return
\t – Horizontal tab
\\ – Backslash
\' – Single quotation mark
\" – Double quotation mark

答案 2 :(得分:0)

您无法就地执行此操作。你为每个'\ n'添加一个新字符('\ r'),这意味着字符串必须展开。最糟糕的情况是每个字符都是'\ n',这意味着我们会将字符串的大小加倍。因此,让我们制作两倍于原始字符串大小的缓冲区。

strtmp = malloc(strlen(str) * 2 + 1); /* +1 for null */
strcpy(strtmp, str);
strptr = strtmp;

for (i = 0; str[i] != 0; i++)
{
    if ((str[i] == '\\') && (str[i+1] == 'n'))
    {
        *strptr++ = '\\';
        *strptr++ = 'r';
    }

    *strptr++ = str[i];
}

printf(strtmp);
free(strtmp);

答案 3 :(得分:0)

字符串中的\n是转义序列,由一个字符表示。

您的代码应该是这样的:

int main(void)
{
    char str[] = "Hi\n, How are you \n, are you okay\n";
    char *strPtr = str;

    int i, j;
    int count=0;

    for(i = 0; str[i]!='\0'; ++i)
    {
       if (`\n` == str[i]) ++count;
    }
    strPtr = malloc(i + 1 + count);
    for(i = j = 0; str[i]!='\0'; ++i)
    {
       if ('\n' == str[i]) strPtr[j++] = `\r`;
       strPtr[j++] = str[i];
    }
    strPtr[j] = 0;

    printf("This many times we changed it", count);
}

修改

因为你决定改变这个问题(顺便说一句 - 只是添加问题以便澄清而不删除原始OP的大块,因为答案对未来的访问者没有任何意义) - 这是代码:

int main(void)
{
    char str[] = "Hi\r\n, How are you \r\n, are you okay\r\n";

    int i, j;
    for (i = j = 0; 0 != str[i]; ++i)
    {
       if ('\r' == str[i] && '\n' == str[i + 1])
       {
          ++count;
       }
       else
       {
          str[j++] = str[i];
       }
    }
    str[j] = 0;

    .. etc - str is without \r\n but \n, count is the number of lines.