【发布时间】:2017-09-21 20:44:07
【问题描述】:
我是 C 的新手,所以我很难弄清楚这一点。我一次读取文件 500 个字节,计算文件中的行数,然后一旦达到 500 行,我将其写入另一个文件。该文件根本没有正确输出,我认为这与我在将其写入文件之前尝试连接一个长字符串有关。这是我现在拥有的代码的主循环:
while (lineCount != 500)
{
if (lineCount == 500)
break;
readbytes = read(infd, buf, 500);
for (str = buf; *str; ++str)
{
lineCount += *str == '\n';
char *newPtr = realloc(forkBuf, (strlen(forkBuf) + strlen(str) + 2));
forkBuf = newPtr;
char* newFork = realloc(forkBuf, (strlen(forkBuf) + strlen(str) + 2));
sprintf(forkBuf, "%s%s", newFork, str);
if (lineCount == 500)
break;
}
if (lineCount < 500)
{
if(readbytes < 500){
write(outfd, forkBuf, (strlen(forkBuf) + 2));
break;
}
continue;
}
write(outfd, forkBuf, (strlen(forkBuf) + 2));
}
【问题讨论】:
-
你为什么要写
lineCount += *str == '\n';这样的代码?这会让事情变得有点难以阅读吗? -
考虑到上面的
while声明,if (lineCount == 500)的真实性如何 -
我知道那部分肯定更具可读性。而 if 语句之所以存在,是因为我经历了许多不同的变化,试图找出这个问题。工作后需要进行一些清理
-
我只能想到 StackOverflow 上已经有大约 5,287 个字符串连接示例。只要不耗尽系统内存,长度无关紧要。
-
注意
read()没有得到字符串;它得到一个字节数组,不一定是空终止的。实际上,它通常不是空终止的。您应该跟踪字节缓冲区的实际长度,并使用内存函数(memmove()、memcpy()等)而不是字符串函数。
标签: c string concatenation