StarTrek18
StarTrek18

Reputation: 323

Correct way of initializing a non known value String in C

Say I want to create a String that will hold some values based on another string. Basically, I want to be able to compress one string, like this: aaabb -> a3b2 - But my question is:

In Java you could do something like this:

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.
}

As you can see, we have initialized an empty string and we can modify it (mystr += last + "" + count;). How can you do that in C?

Upvotes: 0

Views: 122

Answers (3)

Bishoy
Bishoy

Reputation: 725

You can use string concatenation method strcat: http://www.cplusplus.com/reference/cstring/strcat/

You define your string as following:

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

To convert the character last into a string to be able to concatenate it, you use the following syntax:

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

To convert the count into a string you need to use itoa function as following:

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

Then you can use strcat as following:

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

Another solution is to use STL String class or MFC CString if you are using Visual C++.

Upvotes: 0

DNT
DNT

Reputation: 2395

In C (not C++) you can do something like this:

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);

This will create a string in 'mystr':

"abcdefb100"

You can then concatenate more data to this string using strcat()

strcat(mystr, "xyz"); // now it is "abcdefb100xyz"

Please note that mystr has been declared to be 1024 bytes long and this is all the space you can use in it. If you know how long your string will be you can use malloc() in C to allocate the space and then use it.

C++ has much more robust ways of dealing with strings, if you want to use it.

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726589

Unfortunately, in C you cannot have it as easy as in Java: string memory needs dynamic allocation.

There are three common choices here:

  1. Allocate as much as you could possibly need, then trim to size once you are done - This is very common, but it is also risky due to a possibility of buffer overrun when you miscalculate the max
  2. Run your algorithm twice - the first time counting the length, and the second time filling in the data - This may be the most efficient one if the timing is dominated by memory allocation: this approach requires you to allocate only once, and you allocate the precise amount of memory.
  3. Allocate as you go - start with a short string, then use realloc when you need more memory.

I would recommend using the second approach. In your case, you would run through the source string once to compute the compressed length (in your case, that's 5 - four characters for the payload "a3b2", and one for the null terminator. With this information in hand, you allocate five bytes, then use the allocated buffer for the output, which is guaranteed to fit.

Upvotes: 4

Related Questions