我正在尝试反转字符串“Hello bob”,然后使用C和内联汇编将其传递给另一个字符串。我正在使用Visual Studio C ++,结果是"Dbob bob"
。我在这里做错了什么?
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
int _tmain(int argc, _TCHAR* argv[])
{
char source[10] = "Hello bob";
char dest[] = "";
int i;
for (i = 0; i < 10; ++i)
{
source[i] = source[10-i-1];
}
__asm
{
lea esi, source
cld
lodsb
lea edi, dest
mov eax, 0xFF
stosb
lea edi, dest
cld
mov ecx, length source
mov eax, 0x44
rep stosb
lea esi, source
lea edi, dest
mov ecx, length source
cld
rep movsb
}
printf("%s",source);
printf("%s" ,"\n");
printf("%s",dest);
getchar();
return 0;
}
答案 0 :(得分:1)
在你到达之前,你正在覆盖字符串的第二部分。你需要做一个“完全交换”(a->temp; b->a; temp->b;
)。而不是
for (i = 0; i < 10; ++i)
{
source[i] = source[10-i-1];
}
一个简单的解决方法是将其更改为
char dest[10];
for (i = 0; i < 10; ++i)
{
dest[i] = source[10-i-1];
}
从另一个角度来看,如果你从“Hello Bob”开始,你会得到:
Hello Bob
^
bello Bob
^
bollo Bob
^
boBlo Bob
^
boB o Bob
^
boB o Bob
^
boB o Bob
^
boB o Bob
^
boB o Bob
^
我指出每次复制的信件......你可以看到发生了什么。
答案 1 :(得分:-1)
你使这变得比以前复杂得多:
const unsigned int SIZE = 11;
char source[SIZE] = "Hello Bob";
for (unsigned int i = 0; i < SIZE / 2; ++i) // you only need to go to the halfway point
{
// std::swap(source[i], source[SIZE - i - 1]);
char temp = source[i];
source[i] = source[SIZE - i - 1];
source[SIZE - i - 1] = temp;
}
这会将字符串反转到位。如果你想把它做到另一个数组:
const unsigned int SIZE = 11;
char source[SIZE] = "Hello Bob";
char dest[SIZE] = {0};
for (unsigned int i = 0; i < SIZE; ++i)
{
dest[i] = source[SIZE - i - 1];
}