Sprintf() 搞砸了并且没有做我想做的事情

问题描述 投票:0回答:1

所以我和我的助教一直在试图找出为什么这不起作用,因为对于我的作业,我们必须使用 sprintf() 和一个全新的缓冲区来打印文本文件中的每一行。没有 sprintf() 并正常打印它,它工作得很好。

这就是我需要的

这就是我使用 sprintf() 得到的

这是我的代码:

int buff = 1000;

    char *ptr = mmap (NULL,buff, PROT_WRITE | PROT_READ ,MAP_PRIVATE| MAP_ANONYMOUS,0,0);
        if(ptr == MAP_FAILED){
            printf("Mapping Failed\n");
            return 1;
        }
    char *oof = mmap (NULL,buff, PROT_WRITE | PROT_READ ,MAP_SHARED| MAP_ANONYMOUS,0,0);
        if(oof == MAP_FAILED){
            printf("Mapping Failed\n");
            return 1;
        }
    int f1 = open("file2.txt", O_RDWR);
    int fd = open("file.txt", O_RDONLY);
        if(fd < 0){
            printf("Uh oh u made an oopsie\n");
        }else{
            printf("Hey look at that it opened\n\n");
        }

        int length = read(fd,ptr,sizeof(char)*buff);
        int count = 1;

    for(int i = 0; i<length;i++){
        if(ptr[i] == '\n'){
            count++;
        }
    }

    int lengths[count];
    for(int i = 0;i<count;i++){
        lengths[i] = 0;
    }

    int m = 0;
    for(int i = 0;i<length;i++){
        lengths[m]++;
        if(ptr[i] == '\n'){
            m++;
        }
    }

    int j = 0;
    int k = 0;
    char **lineArray = (char **) malloc(sizeof(char *) *count);
    for(int i = 0; i<count; i++){
       
        
        lineArray[i] = (char *) malloc(sizeof(char)* lengths[i]);
        k = 0;
        while(ptr[j] != '\n')
        {
            lineArray[i][k] = ptr[j];
            j++;
            k++;
        }
        j++;

        sprintf(oof,"\nlineArray[%d] = %s\n",i,lineArray[i]);
        write(1,oof,sizeof(char)*buff);
        //printf("\nlineArray[%d] = %s\n",i ,lineArray[i]);
    }

我已经搞乱了这么多,我知道它与 mmap 缓冲区的东西有关,但我不知道如何修复它。

c printf buffer mmap
1个回答
0
投票

本部分:

        sprintf(oof,"\nlineArray[%d] = %s\n",i,lineArray[i]);
        write(1,oof,sizeof(char)*buff);

您无条件写入

buff
(=1000) 个字节,因此它可能包含前几行中的数据。

您应该从

sprintf
的返回值中获取字符串的长度,并将其用作要写入的大小:

        int stringLength = sprintf(oof,"\nlineArray[%d] = %s\n",i,lineArray[i]);
        if (stringLength > 0) write(1,oof,sizeof(char)*stringLength);
© www.soinside.com 2019 - 2024. All rights reserved.