1

我一直在学习一些聪明的 C 函数,它们需要一个循环,但不需要执行循环体(如strcpy()),因此只有一行长。

只是出于兴趣,有没有办法\n像这样将所有换行符与空格的替换减少到一行?

目前我有

char* newline_index;
while (newline_index = strchr(file_text, '\n'))
{
    *newline_index = ' ';
}

我想做这样的事情:

while (*strchr(file_text, '\n') = ' ');

但当然,当 strchr 返回 null 时,我会尝试取消引用空指针。

我知道使用 strchr 是作弊,因为它包含更多代码,但我想看看是否有一种仅使用标准 c 函数的方式来做到这一点。


编辑:在一些帮助下,这是我想出的最好的:

char* newline_index;
while ((newline_index = strchr(file_text, '\n')) && (*newline_index = ' '))
4

2 回答 2

3

这是一种相当有效且简单的方法:

for(char *p = file_text; (p = strchr(p, '\n')); *p = ' ')
    ;
于 2013-05-09T06:13:50.157 回答
3

我建议以下代码。以下代码在一行中,它避免了函数的调用strchr()

char* p = file_text;
while(*p!='\0' && (*p++!='\n' || (*(p-1) = ' ')));

您还可以使用for循环:

char* p;
for(p = file_text; *p!='\0' && (*p!='\n' || (*p = ' ')); p++);

对于您提供的解决方案:

char* newline_index;
while ((newline_index = strchr(file_text, '\n')) && (*newline_index = ' '))

以这种方式调用strchr()将使搜索从您file_text每次要搜索的开头开始'\n'

我建议将其更改为:

char* newline_index = file_text;
while ((newline_index = strchr(newline_index, '\n')) && (*newline_index = ' '))

这将允许从最后一个位置而不是从头开始strchr()继续搜索。'\n'

即使进行了优化,strchr()函数的调用也需要时间。所以这就是为什么我提出了一个不调用strchr()函数的解决方案

于 2013-05-09T05:06:15.167 回答