如何在C语言中连接字符串和整数?

94
我需要在循环的每一次迭代中形成一个包含循环索引i的字符串。
for(i=0;i<100;i++) {
  // Shown in java-like code which I need working in c!

  String prefix = "pre_";
  String suffix = "_suff";

  // This is the string I need formed:
  //  e.g. "pre_3_suff"
  String result = prefix + i + suffix;
}

我尝试使用各种不同的strcatitoa的组合,但都没有成功。


4
展示你的尝试,而不是你想要的结果,通过对你的代码进行评论,你将学到更多,而不是让别人告诉你该怎么做。 - CharlesB
请完整陈述您的问题...看起来您遇到了问题,但是您没有提到具体是哪个问题?字符串没有形成还是其他问题? - S M Kamran
11
这不是他的代码,而是类似Java风格的伪代码。他的问题是他不知道如何在C语言中实现这个。 - Lightness Races in Orbit
3个回答

151

C中的字符串处理比较困难。

#include <stdio.h>

int main()
{
   int i;
   char buf[12];

   for (i = 0; i < 100; i++) {
      snprintf(buf, 12, "pre_%d_suff", i); // puts string into buffer
      printf("%s\n", buf); // outputs so you can see it
   }
}

12字节足以存储文本"pre_",文本"_suff",长度最多为两个字符的字符串("99")和C字符串缓冲区末尾的NULL终止符。

这里可以告诉您如何使用snprintf,但我建议阅读一本好的C语言书籍!


1
我想给你点个赞,但是你回答的第一行与之后的内容有些矛盾。事实上,你已经展示了解决方法很简单;你只需要抛弃那些来自脚本语言的低效字符串拼接习惯即可,在C语言中,几乎任何关于字符串拼接的问题都可以使用snprintf函数解决。 - R.. GitHub STOP HELPING ICE
5
@R。我所展示的是解决方案并不像OP所希望的那样简单。对于有些人来说,“仅仅”抛出这个概念比其他人更难。 - Lightness Races in Orbit
1
另外,你应该使用 snprintf 而不是 sprintf。我在第一次阅读时错过了这一点。你的代码写得非常危险,因为如果将 100 更改而不更新缓冲区大小,就会破坏堆栈。 - R.. GitHub STOP HELPING ICE
2
@R. 当你改变100时,你改变了缓冲区大小。使用snprintf并不会改变这一点;它只是意味着你有一个更多的地方来写和更新缓冲区大小。 - Lightness Races in Orbit
6
你的代码和使用snprintf的版本的区别在于当有人忘记更改缓冲区大小时,你的代码会崩溃(或者更糟糕的是导致特权被攻击),而使用snprintf的版本只会截断字符串。无论如何,我建议将缓冲区大小设为12+3*sizeof(int),这样你就不必担心了...但是最好还是使用snprintf - R.. GitHub STOP HELPING ICE
@delive:你说的“不起作用”是什么意思?你遇到了什么问题? - Lightness Races in Orbit

9

使用 sprintf(如果像我一样不擅长计数,可以使用 snprintf)和格式字符串 "pre_%d_suff"

如果你想用 itoa/strcat 也可以实现:

char dst[12] = "pre_";
itoa(i, dst+4, 10);
strcat(dst, "_suff");

3
"itoa" 是什么意思? - Antti Haapala -- Слава Україні
2
根据C++参考文献,关于itoa,它指出:“此函数未在ANSI-C中定义,也不是C++的一部分,但受某些编译器支持。” - Gaurang Tandon
1
@AnttiHaapala--СлаваУкраїні,itoa函数将一个整数转换为字符字符串。 - 3n6in33r
@Koldsoar,引号的意思是:该函数不是标准C库的一部分。 - Antti Haapala -- Слава Україні

1
看看 snprintf 或者,如果 GNU 扩展可用,可以使用 asprintf(它会为您分配内存)。

3
为您分配内存并不是在帮助您。需要的内存大小有一个较小的常数限制,所以更明智的做法是自己提供缓冲区。如果使用asprintf,则需要添加一个分配失败的测试和稍后释放缓冲区的代码。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接