转换一个向量的价值观为char写入系统调用指针

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

我有一些麻烦,使用write()。我有一个在它有几个不同的长值vector<long>。我的最终目标是将这个向量转换成字符指针,这样我可以将它传递给write和打印值到标准输出。

这里是我的代码:

void print_vector(vec* v)
{
    int init_capacity = 10;
    char* output = (char*) malloc(init_capacity*sizeof(char));
    int cols = (int) sqrt(v->size);


    for (int i = 0; i < v->size; i++)
    {
        if(i==init_capacity)
        {
            init_capacity *= 2;
            output = (char*)realloc(output, init_capacity*sizeof(char));
        }
        const int n = snprintf(NULL, 0, "%l", v->data[i]);
        char buffer[n+1];
        int c = snprintf(buffer, n+1, "%l", v->data[i]);
        if ((i + 1) % cols == 0) {
            strcat(buffer, '\n');
        }

        output[i] = buffer;
    }

    write(1, output, init_capacity);
//    for (int i = 0; i < v->size; i++)
//    {
//        printf("%ld ", v->data[i]);
//        if ((i + 1) % cols == 0) {
//            puts("");
//        }
//    }

}

我首先初始化字符*,我打算通过为缓冲区write。我给它10的初始容量,并作为我遍历向量,并通过它的值以我的缓冲output,我重新分配空间如果用完了。

在我的for循环中,我第一次检查,看看是否我output已用完的空间和realloc如果我需要。

然后我加载我矢量的ith元件成buffer(不要与output混淆)。我这样做是因为我想在列的最后一个值的末尾添加"\n"(这是应该看起来像一个矩阵)。你会看到,在第二,如果在代码中,在那里我串连声明“\ n”来缓冲。

我在做一些非常错误的,因为我得到一个段错误。

有两个原因,我认为这种情况正在发生:

  1. 我怀疑有件事我做错了与buffer。我不知道它可能是什么,但...也许char buffer[n+1]是不幸福吗?我真的不是很确定。
  2. 我可能会被误解为strcat的输入。难道缓冲区不属于那里?
  3. 我相当肯定output[i]= buffer不正确。

我需要这方面的帮助,并希望一些解释。

这是一个家庭作业的问题。你没有给我确切的答案。这将是很好的,虽然如果有说明去用它 - 我所真正需要的是一个例子。

我已经包含在了我想要做以下write()的意见。

编辑:

新的代码:

void print_vector(vec* v)
{
    int cols = (int) sqrt(v->size);
    for (int i = 0; i < v->size; i++)
    {
        int n = snprintf(NULL, 0, "%ld", v->data[i]);
        char buffer[n+1];
        sprintf(buffer, n+1, "%ld", v->data[i]);
        if ((i + 1) % cols == 0) {
            strcat(buffer, "\n");
        } else {
            strcat(buffer, " ");
        }

        write(1, buffer, n+1);
    }


//    for (int i = 0; i < v->size; i++)
//    {
//        printf("%ld ", v->data[i]);
//        if ((i + 1) % cols == 0) {
//            puts("");
//        }
//    }
}

当我运行GDB,我得到这样的输出:

program received signal SIGSEGV, Segmentation fault.
__strchrnul_sse2 () at ../sysdeps/x86_64/multiarch/../strchr.S:32
32  ../sysdeps/x86_64/multiarch/../strchr.S: No such file or directory.
(gdb) 

这我想是没有帮助...

一些警告,当我编译:

$ make
gcc -g -o ctp transpose.c vec.c -lm
transpose.c: In function ‘print_vector’:
transpose.c:59:25: warning: passing argument 2 of ‘sprintf’ makes pointer from integer without a cast [-Wint-conversion]
         sprintf(buffer, n+1, "%ld", v->data[i]);
                         ^
In file included from transpose.c:2:0:
/usr/include/stdio.h:320:12: note: expected ‘const char * restrict’ but argument is of type ‘int’
 extern int sprintf (char *__restrict __s,
c system-calls
1个回答
1
投票

有没有必要使用snprintf()第二次,你可以只使用sprintf()。第一个电话告诉你的输出将持续多久,以及您为分配足够的空间,当你宣称buffer。所以你不必担心缓冲区溢出当你真正把它写。

如果你使用snprintf(),你不应该使用n+2为限。因为你需要留出空间换行,你应该使用n+1

if语句需要写入一个空间,所以你必须在矩阵列之间的一些条款else

    if ((i + 1) % cols == 0) {
        strcat(buffer, "\n");
    } else {
        strcat(buffer, " ");
    }

还要注意的是,第二个参数strcat()必须是一个字符串,而不是char

如果你真的想这个看起来像一个漂亮的矩阵,你应该具体的宽度在格式字符串的输出,使所有列将是相同的尺寸。这也意味着,你不需要动态指定buffer的大小,它只是需要足够大的那个宽度。

© www.soinside.com 2019 - 2024. All rights reserved.