在C中获得一个额外的\字符

时间:2013-02-11 07:09:32

标签: c

鉴于字符串ptr,我想要的输出是嗨\\ n嘿\ n我正在运行linux,这就是为什么我有两个斜线,因为linux将\ n视为\\ n

是,而不是在我的最终输出中结束\ n(尽管它被解析为\\ n)我最终得到了一个\\ n(这意味着它被解析为\\\ n 我的代码:

char *ptr="hi\\r\\n hey \\r\\n";
for( i=0; ptr[i]!=0; i++ )
{
    while(ptr[i]=='\\' && ptr[i+1]=='r') /* copy all chars, including NULL at end, over char to left */
    {
        j=i;
        int count = 0;
        while(ptr[j]!='\0')
        {
            if(count==0)
            {
                ptr[j]=ptr[j+2];
                count++;
                j++;
            }
            else
            {
                ptr[j]=ptr[j+1];
                j++;
            }
        }
    }
}

我遇到的错误是 是,而不是结束\ n我最终得到一个\ n

1 个答案:

答案 0 :(得分:0)

那是因为你的复制逻辑。在找到\ r之后的while部分中,你将j + 2复制到j,然后将j递增1.然后将j + 1复制到j,所以基本上你要复制相同的字符两次。

尝试此更改块

的ptr [J] = PTR [J + 1];改为ptr [j] = ptr [j + 2];

while(ptr[j]!='\0')
        {
            if(count==0)
            {
                ptr[j]=ptr[j+2];
                count++;
                j++;
            }
            else
            {
                ptr[j]=ptr[j+2];
                j++;
            }
        }
    }

对于你的情况(忽略转义字符并使它变小)str = hi \ r \ n嘿

当j = 2时,它进入while循环 现在循环

while(ptr[j]!='\0')
            {
                if(count==0)` - true`
                {
                    ptr[j]=ptr[j+2]; ` ==> str is now = (hi\r\n hey) (replaced \ at 2 by \ at 4`
                    count++;  `==> count = 1`
                    j++;   ` == j = 3`
                }
                else                  ` ==skipped`
                {
                    ptr[j]=ptr[j+1];
                    j++;
                }
            }
        }
NEXT ITERATION

while(ptr[j]!='\0')
            {
                if(count==0) `- false`
                {
                    ptr[j]=ptr[j+2];
                    count++;  
                    j++;    
                }
                else        
                {
                    ptr[j]=ptr[j+1];  `==> str is now = (hi\\\n hey) (replaced r at 3 by \ at 4`
                    j++; `j==> 4`
                }
            }
        }

因此给你一个额外的'\'