在C中初始化非已知值String的正确方法

时间:2014-03-30 23:21:59

标签: c string

假设我想创建一个String,它将根据另一个字符串保存一些值。基本上,我希望能够压缩一个字符串,如下所示:aaabb - > a3b2 - 但我的问题是:

在Java中你可以这样做:

String mystr = "";
String original = "aaabb";

char last =  original.charAt(0);
for (int i = 1; i < original.length(); i++) {
  // Some code not relevant
  mystr += last + "" + count; // Here is my doubt.
}

如您所见,我们初始化了一个空字符串,我们可以对其进行修改(mystr += last + "" + count;)。你怎么能用C做到这一点?

3 个答案:

答案 0 :(得分:4)

不幸的是,在C语言中你不能像在Java中那样容易:字符串内存需要动态分配。

这里有三种常见的选择:

  1. 尽可能多地分配,然后在完成后修剪大小 - 这是非常常见的,但是当你错误估算最大值时,由于缓冲区溢出的可能性也存在风险
  2. 运行算法两次 - 第一次计算长度,第二次填充数据 - 如果时间由内存分配控制,这可能是最有效的:这种方法需要你只需要分配一次,然后分配精确的内存量。
  3. 随时分配 - 以短字符串开头,然后在需要更多内存时使用realloc
  4. 我建议使用第二种方法。在您的情况下,您将通过源字符串运行一次以计算压缩长度(在您的情况下,有效负载"a3b2"为5 - 四个字符,空终结符为一个。有了这些信息,您分配五个字节,然后使用分配的缓冲区作为输出,保证适合。

答案 1 :(得分:0)

在C(不是C ++)中你可以这样做:

char mystr[1024];
char * str = "abcdef";
char c = str[1];  // will get 'b'
int int_num = 100;
sprintf(mystr, "%s%c%d", str, c, int_num);

这将在&#39; mystr&#39;:

中创建一个字符串
"abcdefb100"

然后,您可以使用strcat()

将更多数据连接到此字符串
strcat(mystr, "xyz"); // now it is "abcdefb100xyz"

请注意,mystr已声明为1024字节长,这是您可以在其中使用的所有空间。如果你知道你的字符串有多长,你可以在C中使用malloc()来分配空间然后使用它。

如果你想使用它,C ++有更强大的处理字符串的方法。

答案 2 :(得分:0)

您可以使用字符串连接方法strcathttp://www.cplusplus.com/reference/cstring/strcat/

您可以将字符串定义如下:

char mystr[1024]; // Assuming the maximum string you will need is 1024 including the terminating zero

要将字符last转换为字符串以便能够连接它,请使用以下语法:

char lastString[2];
lastString[0] = last; // Set the current character from the for loop
lastString[1] = '\0'; // Set the null terminator

要将计数转换为字符串,您需要使用itoa函数,如下所示:

char countString[32];
itoa (count, countString, 10); // Convert count to decimal ascii string

然后你可以使用strcat:

strcat(mystr, lastString);
strcat(mystr, countString);

如果您使用的是Visual C ++,则另一种解决方案是使用STL String类或MFC CString。