我正在尝试将新行字符\ 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”
答案 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.