我应该将 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
最佳答案
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';
}
关于c - 不使用指针反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358251/