使用空格查找并替换数组中的制表符?

时间:2016-01-26 10:24:13

标签: c arrays

本练习的目的是创建一个程序,该程序可以读取文件的内容并将其复制到新文件中。但还有另一件事要做,我不知道该怎么做: 我还应该替换我在7个空格的文件中找到的所有标签(' \ t')。 我怎样才能解决后一个问题呢?谢谢。

我尝试使用这些代码行,但显然无法正常工作。它还会显示以下警告:

  

警告C4047:' =':' char'间接级别与' char [8]'

不同
for (int i = 0; i < x; i++){
    if (buf[i] == '\t') {
        buf[i] = "       ";
    }
}

这是我的代码:(当然如果可以某种方式改进,请不要犹豫告诉我。谢谢)

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

int main(void) {
    char buf[500];
    FILE *fp, *nuovo;
    errno_t err, err1;

    /*lettura e creazione file*/
    if (err = fopen_s(&fp, "text.txt", "r")) {
        printf("Errore");
    } else {
        printf("File Letto");
    } 
    if (err1 = fopen_s(&nuovo, "nuovo.txt", "w")) {
        printf("Errore");
    } else {
        printf("File Creato");
    }

    int x = fread_s(buf, sizeof(buf), 1, 500, fp);
    /*THIS IS THE PLACE FOR THE MISSING CODE*/


    fwrite(&buf, 1, x, nuovo);
    fclose(fp);
    fclose(nuovo);
}

2 个答案:

答案 0 :(得分:2)

您不能将一个字符替换为具有多个字符的字符串。

解决此问题的一种方法如下:您可以在执行输出时执行替换,而不是进行替换。

遍历buf中的字符,并检查buf[i]是否为TAB。如果不是TAB,请致电fputc(buf[i], nuovo)。否则,请致电fputs(" ", nuovo)

答案 1 :(得分:1)

您必须创建一个新的动态分配缓冲区,您将从源复制所有字符并用空格替换制表符:

#include <malloc.h>


const char *whitespace = "       ";
int whitespaceLen = strlen( whitespace );
int newBufSize = 0;
char *newBuf = NULL;
int newBufPos = 0;

for (int i = 0; i < x; i++)
{
    int isTab = buf[i] == '\t';               // test if next char in buf is tab
    int charSize = isTab ? whitespaceLen : 1; // size which is neede for next char in newBuf

    if ( newBufPos + charSize < newBufSize ) // test if newBuf is large enough
    {
        newBufSize += 500;
        char *temp = realloc( newBuf, newBufSize ); // enlarge newBuf
        if ( temp == NULL )
        {
            free( newBuf ); // out of memory, free newBuf an terminate
            newBuf = NULL;
            break;
        }
        newBuf = temp;
    }

    if ( isTab )
    {
         memcpy( newBuf+newBufPos, whitespace, whitespaceLen ); // copy whitespace blanks to newBuf
         newBufPos += whitespaceLen ;
    }
    else
         newBuf[ newBufPos++ ] = buf[i];  // copy char to newBuf
}

请注意某处free( newBuf );