我应该将char orig[]
复制到char reversed[]
并将其反转。我的函数有效,但没有正确重置字符串,这可以通过空字符串返回先前的测试结果来证明。我该如何解决这个问题?
void reverse(char orig[], char reversed[]) {
int lastChar = strlen(orig) - 1;
int lastCopy = lastChar;
int i;
for(i = 0; i < lastChar; i++){
reversed[lastCopy] = orig[i];
reversed[i] = orig[lastCopy];
lastCopy--;
reversed[lastChar+1] = '\0';
}
return ;
}
这是我得到的输出:
Test "software" (Pass, returns: erawtfos)
Test the empty string
Assertion failure
Have: <erawtfos>
Expect: <>
Test a long string (Pass)
Test a simple palindrome (Pass)
4 assertions: 3 passed 1 failed
答案 0 :(得分:1)
OP问题:当原始字符串orig
的长度为0或1时,永远不会在reversed
中设置空字符。
而是创建一个简单的循环,一次拉动1 char
。
// As `orig` elements are not changed, good C style to make it `const`
void reverse(const char orig[], char reversed[]) {
// use `size_t` as `int` may be too narrow
size_t length = strlen(orig);
size_t i;
for(i = 0; i < length; i++) {
reversed[i] = orig[length - i - 1];
}
reversed[i] = '\0';
}
如果orig
和reversed
可能重叠,则需要临时副本。
void reverse(const char orig[], char reversed[]) {
size_t length = strlen(orig);
char tmp[length+1]; // Add 1 because an array of size 0 is UB
memcpy(tmp, orig, length);
size_t i;
for(i = 0; i < length; i++) {
reversed[i] = tmp[length - i - 1];
}
reversed[i] = '\0';
}
答案 1 :(得分:0)
简化:
void reverse(char orig[], char reversed[]) {
int len = strlen(orig);
int last = len - 1;
reversed[len] = '\0';
for (int i = 0; i < len; i += 1) {
reversed[last] = orig[i];
last -= 1;
}
return;
}
答案 2 :(得分:-1)
你可以使用内置函数,如string :: rbegin(),string :: rend()
以反向复制字符串。
string copy(orig.rbegin(),orig.rend());
不要忘记包含&lt; string.h&gt;