【问题标题】:Concatenating integer and char in C using sprintf使用 sprintf 在 C 中连接整数和字符
【发布时间】:2014-04-23 09:15:47
【问题描述】:

在我用 C 语言编写的赋值中,我需要将符号“#”和一个整数(例如 16)连接到字符串“#16”。这不是要打印出来的,而是要作为参数传递给另一个函数。据我了解,我应该使用函数 sprintf。但是,我遇到了分段错误,所以我显然做得不对。 我给你举个例子,你可以告诉我我做错了什么:

void methodA(){
    char* input;
    sprintf(input, "#%d", 16);
    methodB(input);
}

void methodB(int a){
    // Code here

    // Sacrifice the power of a to Darth Sidious
}

编辑:对于那些最先回答的人:char 输入是一个错字,应该说 char* 输入,我已经知道了。对此感到抱歉。

【问题讨论】:

  • 您正在sprintf将您的字符串放入一个单字符缓冲区。其次,您将 char 传递给 methodB,它期待 int
  • 你声明 char* input; 为指针分配空间,而不是为它指向 at 的任何东西(就像一个大到足以容纳至少 4 个字符的数组)。此外,您的 methodB() 期待 int,这不是您传递的内容。

标签: c segmentation-fault string-concatenation printf


【解决方案1】:

sprintf 采用 char*,而不是 char

int sprintf(char *str, const char *format, ...);

是的,更喜欢使用snprintf

【讨论】:

  • 而且还需要比单个字符更多的空间。使用snprintf() 会更好/更安全。
  • char 输入是一个错字,我的意思是你说的 char* 输入。
【解决方案2】:
void methodA(){
    char input[4];
    sprintf(&input[0], "#%d", 16);
    methodB(&input[0]);
}

void methodB(char *a){
    // Code here

    // Sacrifice the power of a to Darth Sidious
}

注意,我使用了 '&x[offset]' 样式来明确我们正在传递数组第一个元素的地址。

【讨论】:

    【解决方案3】:

    您没有初始化输入,因此它指向未定义的内存。先分配内存

    void methodA(){
        char input[SIZE];  // or char* input = malloc(SIZE);
        sprintf(input, "#%d", 16);
        methodB(input);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 2021-10-03
      • 2013-10-09
      • 2012-07-18
      • 2016-04-15
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多