简体   繁体   中英

Reverse Array of C-Strings

I have a few questions regarding array of strings in C.

I have an array char *string . I have a char *string and then I split every 4 characters in a array of strings called sep_str. So for example if char *string = 'The sum'; , then char **sep_str is:

0: |_| --> "The "
1: |_| --> "Sum"

My first question is, in an array of strings in C (so array of array of chars), will there be a null terminating character at the end of each sep_str[i], or just at the last position of sep_str? Here is how I copy string into an array of strings:

    for (int i = 0; i < str_length; i++) {
        sep_str[i/4][i%4] = *ptr;
        ptr++;
    }

My second question is, how would I reverse the elements of each string in sep_str ? Here's how I did it, but I feel like it is stepping out of the array of the substring. (so out of the element of the sep_str):

// Reverse each element in the array
    char temp;

    for (int i = 0; i < num_strs; i++) {

        for (int j = 0, k = 4; j < k; j++, k--) {

            temp = sep_str[i][j];
            sep_str[i][j] = sep_str[i][k];
            sep_str[i][k] = temp;
        }
    }

My first question is, in an array of strings in C (so array of array of chars), will there be a null terminating character at the end of each sep_str[i], or just at the last position of sep_str?

Only at the end, but if you want to treat each individual chunk as its own string, you'll need to add the \\0 yourself.

My second question is, how would I reverse the elements of each string in sep_str?

You could do it with pointers...

char temp;

// Point to start of string, `str` will decay to first memory position.
char *start = str;

// Point to the end of the string. You will need to `#include <string.h>`
// for `strlen()`. Otherwise, write a `while` loop that goes until `\0` to find
// the last position.
char *end = &str[strlen(str) - 1];

// Do until we hit the middle of the string.
while (start < end) {

   // Need a temp char, no parallel assignment in C.
   temp = str[start];

   // Swap chars.
   str[start++] = str[end];
   str[end--] = str[temp];
}

Assuming str is your string.

In a C string, there will be only one termination character. But if you need to tokenize the strings, then each string must be null terminated.

But before that -

char *string = "The sum"; // should be const char* string = "The sum";

String literal in the above case resides in read only location and cannot be modified. If you need to modify, then

char string[] = "The sum";

If you don't have the terminating character in your strings then yes, you will be outside the bounds of the array since you are accessing sep_str[i][4], which is not a valid location:

sep_str[0] = 'T'
sep_str[1] = 'h'
sep_str[2] = 'e'
sep_str[3] = ' '

However, I doubt that you want to have the null character at the beginning of your string, so you need k=3 in your for loop, not k=4.

The copy of the strings sounds good to me. Since each string has always 4 chars, you can avoid the null terminator \\0 . Alternatively you need to declare sep_str as a 5x(lenght/4) matrix, to store the \\0 char at the end of each string.

To reverse a string you need to iterate from the start to the middle of the string, replacing the i -th char with the length-i-1 -th. You need to replace the inner for replacing k=3 to k=2 .

You also need to take care of the last string, since the lenght might not be multiple of four.

char temp;

for (int i = 0; i < (num_strs - 1); i++) {
    for (int j = 0, k = 3; j < k; j++, k--) {
        temp = sep_str[i][j];
        sep_str[i][j] = sep_str[i][k];
        sep_str[i][k] = temp;
    }
}

if (num_strs > 0) {
    for (int j = 0, k = strlen(sep_str[i]) - 1; j < k; j++, k--) {
        temp = sep_str[i][j];
        sep_str[i][j] = sep_str[i][k];
        sep_str[i][k] = temp;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM