如何从char数组中删除换行符?

时间:2012-05-07 23:11:40

标签: c++ pointers char

我使用此函数将文件的内容放在char数组中:

void Read::readFile(){
FILE * fp = fopen(this->filename,"rt");
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
char *pData = new char[size + 1];
fread(pData, sizeof(char), size, fp);
fclose(fp);
this->data = pData;
}

现在我想从char数组中去掉所有的行尾。 如何在不首先将char-array转换为字符串的情况下执行此操作?

顺便说一句。这是我们不允许使用字符串库的作业的一部分。

4 个答案:

答案 0 :(得分:8)

#include <algorithm>
size = std::remove(pData, pData + size, '\n') - pData;
pData[size] = 0; // optional

对于一些C ++ 11 lambda fun:

#include <algorithm>
size = std::remove_if(pData, pData + size, [](char c) { return c == '\n'; }) - pData;
pData[size] = 0; // optional

答案 1 :(得分:1)

最简单的方法是将第二个缓冲区设置为原始数组的大小。

int len = size;

char* newBufer = calloc(len,sizeof(char));
int i = 0;
int j = 0;
int nlCount = 0;

for(i=0; i<len; i++) {
  if(pData[i] != '\n') {
    newBuffer[j++] = pData[i];
  } else {
    nlCount++;
  }
}

printf("Finished copying array without newlines. Total newlines removed: %d",nlCount);

这里的额外好处是因为你调用了calloc'ed而不是malloc'ing你的数组,所有的值最初都是零,所以在这种情况下,一旦你完成复制,数据在(len-nlCount)到(len) )将全部为零(即:'\ 0'),因此它会自动以空值终止,就像字符串一样。完成后不要忘记释放()数组。

答案 2 :(得分:1)

到位移除:

void strip_newlines(char* p) {
    char* q = p;
    while (p != 0 && *p != '\0') {
        if (*p == '\n') {
            p++;
            *q = *p;
        } 
        else {
            *q++ = *p++;
        }
    }
    *q = '\0';
}

答案 3 :(得分:0)

这样的事情:

void Read::readFile()
{ 
    FILE * fp = fopen(this->filename,"rt"); 
    if (fp)
    {
        char *pData = NULL;

        fseek(fp, 0, SEEK_END); 
        long size = ftell(fp); 
        if (size != -1L)
        {
            pData = new char[size];
            if (size > 0)
            {
                fseek(fp, 0, SEEK_SET); 
                size = fread(pData, sizeof(char), size, fp);
            }
        }
        fclose(fp);

        if (size < 0)
        {
            delete[] pData;
            pData = NULL;
        }
        else if (size > 0)
        {
            char *start = pData;
            char *end = start + size;

            char *ptr = (char*) memchr(pData, '\n', size);
            while (ptr)
            {
                int len = 1;
                if ((ptr > start) && ((*ptr-1) == '\r'))
                {
                    --ptr;
                    ++len;
                }

                memmove(ptr, ptr+len, end - (ptr+len));
                end -= len;

                ptr = (char*) memchr(ptr, '\n', end - ptr);
            }

            size = (end - start);
        }

        this->data = pData; 
        this->size = size; 
    }
}