在C语言中从字符数组中修剪空格

在C语言中从字符数组中修剪空格,c,arrays,string,text,C,Arrays,String,Text,我的字符数组将如下所示 Org_arr[1first line text------2second line text----3third line-------4--------------------5fith line text------]; 组织arr[1第一行文本----2第二行文本----3第三行----4第五行文本----]; 其中“-”等于空格 上述数组从第0位开始每隔20个字符包含一个控制代码(0、1、2、3..) 我想把上面的文本数组转换成下面的格式 将删除空格,并在每行末

我的字符数组将如下所示

Org_arr[1first line text------2second line text----3third line-------4--------------------5fith line text------]; 组织arr[1第一行文本----2第二行文本----3第三行----4第五行文本----]; 其中“-”等于空格

上述数组从第0位开始每隔20个字符包含一个控制代码(0、1、2、3..)

我想把上面的文本数组转换成下面的格式

将删除空格,并在每行末尾添加换行符

Conv_arr[1first line text/n2second line text/n3third line/n4/n5fith line text/n]; Conv_arr[1第一行文本/2第二行文本/n3第三行/n4/n5第五行文本/n];
请推荐一个好的实现方法,

最简单的方法是使用正则表达式将模式“\s?”替换为“\n”

如果您没有访问regex库的权限,可以执行类似的操作

int print_line_break = 1;
char* Conv_arr = (char*)malloc(sizeof(char) * strlen(Org_arr) + 1);

for(char* c=Org_arr; *c; ++c) {
   if (*c == ' ') {
      *(Conv_arr++) = *c;
      print_line_break = 1;
   } else {
      // only print 1 '\n' for a sequence of space
      if (print_line_break) {
         *(Conv_arr++) = '\n';
         print_line_break = 0; 
      }
   }
}

free(Conv_arr);

这段代码很难看,而且闻起来很好笑:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int c;
    char *src, *tgt;
    char mystr[] = "1first line text      "
        "2second line text    "
        "3third line       "
        "4                    "
        "5fith line text      ";

    char *cur = mystr;
    char *prev = NULL;

    while ( ( c = *cur++ ) ) {
        if ( c != ' ' && *cur == ' ' ) {
            prev = cur;
            continue;
        }
        if ( c == ' ' && isdigit(*cur) ) {
            *prev++ = '\n';
            src = cur;
            tgt = prev;
            while ( ( *tgt++ = *src++ ) );
            cur = prev;
        }
    }

    puts( mystr );
    return 0;
}

[sinan@archardy]$ ./t
1first line text
2second line text
3third line
4
5fith line text      
#包括
#包括
#包括
内部主(空){
INTC;
字符*src,*tgt;
char mystr[]=“1第一行文本”
“2第二行文本”
“第三行”
"4                    "
“第五行文字”;
char*cur=mystr;
char*prev=NULL;
while((c=*cur++){
如果(c!=''&&*cur=''){
prev=cur;
继续;
}
如果(c=''&&isdigit(*cur)){
*prev++='\n';
src=cur;
tgt=prev;
而((*tgt++=*src++);
cur=prev;
}
}
puts(mystr);
返回0;
}
[sinan@archardy]美元/吨
1第一行文本
2第二行文本
第三行
4.
第五行文字

在您的示例中,每个数字之间没有精确的20个字符…*感谢malloc cast技巧,我不知道这一点*我使用sizof(char),因为它是编译时构造,没有运行时性能影响,我认为这是一个很好的实践。*我应该在free()上面加上“…”,我只是强调Conv_arr是malloc-ed,应该稍后释放