C字符串的反向数组

时间:2011-10-25 23:03:07

标签: c arrays string char

我对C中的字符串数组有几个问题。

我有一个数组char *string。我有一个char *字符串,然后我将每4个字符分成一个名为sep_str的字符串数组。例如,如果char *string = 'The sum';,则char **sep_str为:

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

我的第一个问题是,在C中的字符串数组(字符数组的数组)中,每个sep_str [i]的末尾是否有一个空终止字符,或者只是在sep_str的最后一个位置?以下是我将string复制到字符串数组中的方法:

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

我的第二个问题是,如何在sep_str中反转每个字符串的元素?这是我如何做到的,但我觉得它是从子串的数组中走出来的。 (因此超出了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;
        }
    }

4 个答案:

答案 0 :(得分:0)

  

我的第一个问题是,在C中的字符串数组(字符数组的数组)中,每个sep_str [i]的末尾是否有一个空终止字符,或者只是在sep_str的最后一个位置?

仅在最后,但如果您想将每个单独的块视为自己的字符串,则需要自己添加\0

  

我的第二个问题是,如何在sep_str中反转每个字符串的元素?

你可以用指针做到......

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];
}

假设str是你的字符串。

答案 1 :(得分:0)

在C字符串中,只有一个终止字符。但是如果你需要对字符串进行标记化,那么每个字符串必须以空值终止。

但在那之前 -

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

上述情况中的字符串文字位于只读位置,无法修改。如果你需要修改,那么

char string[] = "The sum";

答案 2 :(得分:0)

如果你的字符串中没有终止字符,那么是的,你将访问数组的边界,因为你正在访问sep_str [i] [4],这不是一个有效的位置:

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

但是,我怀疑你想在字符串的开头加上空字符,所以你的for循环需要k = 3,而不是k = 4.

答案 3 :(得分:0)

字符串的副本对我来说听起来不错。由于每个字符串总是有4个字符,因此可以避免使用空终止符\0。或者,您需要将sep_str声明为5x(lenght / 4)矩阵,以将\ 0 char存储在每个字符串的末尾。

要反转字符串,您需要从字符串的开头到中间进行迭代,将i - 字符替换为length-i-1 - th。您需要替换内部以将k=3替换为k=2

您还需要处理最后一个字符串,因为长度可能不是四的倍数。

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