我对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;
}
}
答案 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;
}
}