"2つの文字列の配列へのポインタを返す最初は偶数インデックスの文字列 です。奇数インデックスである S」単純なCエクササイズが間違っている:2つの文字列の配列へのポインタを返そうとしています
char **parity_strings(const char *s) {
char** parity = malloc(sizeof(char*) * 2);
char even_strings[] = "";
char odd_strings[] = "";
int x = 0;
int y = 0;
for (int i = 0; i < strlen(s); i++) {
if ((i % 2) == 0) {
even_strings[x] = s[i];
x++;
}
else {
odd_strings[y] = s[i];
y++;
}
}
parity[0] = even_strings;
parity[1] = odd_strings;
return parity;
}
int main(int argc, char **argv) {
char **r = parity_strings(argv[1]);
printf("%s %s %s", r[0], r[1], argv[1]);
return 0;
}
からの文字が私の論理は理にかなっていますが、出力は常に間違っています。たとえば、入力がababab
の場合、私はababab
を返し、期待される出力はaaa bbb ababab
です。私は何を間違えたのですか?
'char even_strings [] =" ";'は長さ1 - ターミネータを持ちます。したがって、インデックス付け 'even_strings [x] = s [i];はUBであり、寿命がなくなったローカル文字列へのポインタも返されます。 –
Cが文字列をどのように扱うかを再検討することを検討するかもしれません。それらは高レベルのオブジェクトではなく、単に 'char'の配列で、ASCIIコードで埋められ、最後に' nul'ゼロがあります。右辺値として使用できるものではありません。 (しかし、文字列へのポインタ、あなたができる) – infixed