如何使用 calloc 和 snprintf

How to use calloc and snprintf

提问人:geek 提问时间:10/25/2023 最后编辑:ikegamigeek 更新时间:10/25/2023 访问量:71

问:

我想使用 calloc 和 snprintf。 你能回顾一下我的简单代码并告诉我如何修复它吗? 我一直有一个错误,即访问冲突写入位置0xFFFFFFFFB8A2D1F0。 谢谢!

int main()
{
 
    char* buffer1;

    buffer1 = (char*)calloc(1, 14);

    int a = 15;
    int b = 25;
    char c[]="MON"

    int k = snprintf(buffer1, 13, "%02d%02%s", a, b, c);

    return 0;
}

希望请修复这个简单的代码。

C printf 卡洛克

评论

1赞 tadman 10/25/2023
还要仔细查看您的格式字符串:.你也错过了一个之后."%02d%02%s";"MON"
2赞 pmg 10/25/2023
Do 和#include <stdlib.h><stdio.h>
1赞 pmg 10/25/2023
您的格式字符串中有 3 个,但只有 2 个有效转换。%
1赞 Weather Vane 10/25/2023
不要运行具有编译器警告的代码,然后想知道为什么会失败。没有警告?启用它们。
2赞 ikegami 10/25/2023
不要以删除您正在询问的问题的方式编辑问题!

答:

1赞 ikegami 10/25/2023 #1

您发布的代码无法编译。

source>:21:5: error: expected ',' or ';' before 'int'
   21 |     int k = snprintf(buffer1, 13, "%02d%02%s", a, b, c);
      |     ^~~

让我们解决这个问题。

尽管如此,修复的代码仍有许多警告。

<source>: In function 'main':
<source>:21:42: warning: conversion lacks type at end of format [-Wformat=]
   21 |     int k = snprintf(buffer1, 13, "%02d%02%s", a, b, c);
      |                                          ^
<source>:21:44: warning: format '%s' expects argument of type 'char *', but argument 5 has type 'int' [-Wformat=]
   21 |     int k = snprintf(buffer1, 13, "%02d%02%s", a, b, c);
      |                                           ~^      ~
      |                                            |      |
      |                                            char * int
      |                                           %d
<source>:21:35: warning: too many arguments for format [-Wformat-extra-args]
   21 |     int k = snprintf(buffer1, 13, "%02d%02%s", a, b, c);
      |                                   ^~~~~~~~~~~
<source>:21:9: warning: unused variable 'k' [-Wunused-variable]
   21 |     int k = snprintf(buffer1, 13, "%02d%02%s", a, b, c);

问题是格式字符串中缺少。d

始终启用编译器的警告并注意它们。使用 gcc,您可以使用 .-Wall -Wextra -pedantic -Werror

评论

0赞 geek 10/25/2023
这实际上不是错误点。我刚刚修复了错别字,但它仍然有一个错误。
0赞 geek 10/25/2023
您可以尝试复制并粘贴我再次修复的代码吗?
1赞 ikegami 10/25/2023
你错过了.同样,始终启用编译器的警告。#include <stdlib.h>
0赞 geek 10/25/2023
我很感激!
2赞 pmg 10/25/2023 #2

这对我有用:

#include <stdio.h>
#include <stdlib.h> // <string.h> not needed

int main(void)
{
    char* buffer1;
    buffer1 = calloc(1, 14); // cast not needed
    if (!buffer1) { fprintf(stderr, "Memory Failure.\n"); exit(EXIT_FAILURE); }

    int a = 15;
    int b = 25;
    char c[4] = "MON";

    int k = snprintf(buffer1, 13, "%02d%02d%s", a, b, c);
    //                    --------------- ^ ---------------
    printf("k is %d; buffer1 has [%s]\n", k, buffer1);

    free(buffer1); // release resources no longer needed

    return 0;
}

查看 https://ideone.com/WMtMQt

评论

0赞 geek 10/25/2023
我很感激!