2017-06-13 33 views
0

我正在搜索連接兩個字符串(由C傳遞)將結果放在第三個字符串中。我做到了,但知道我想在琴絃之間放一個空間,但是......這不可能......! 這是C的部分把連接字符串之間的空格

#include <stdio.h> 
#include <string.h> 

void concatena(char *stringa, char *stringa2, char *dest); 

int main(void) 
{ 
    char stringa[17] = { "stringa numero 1" }; 
    char stringa2[17] = { "stringa numero 2" }; 
    char dest[34] = { "" }; 

    concatena(stringa, stringa2, dest); 

    printf("%s", dest); 

    getchar(); 
} 

調用的MASM32的一部分:

.586 
.model flat 
.code 

_concatena proc 

;pre 
push ebp 
mov ebp,esp 
push ebx 
push edi 
push esi 

;clean 
xor eax, eax 
xor ebx, ebx 
xor ecx, ecx 
xor edx, edx 
xor esi, esi 
xor edi, edi 


mov eax, dword ptr[ebp+8]   ;source=stringa 
mov ebx, dword ptr[ebp+12]   ;target=stringa2 
mov ecx, dword ptr[ebp+16]   ;buffer=dest 

inizio: 
mov dl,byte ptr[eax+esi*1] 
cmp dl,0 
je space ;first string finished 
mov byte ptr[ecx+esi*1], dl 
inc esi 
jmp inizio 

space: 
inc esi 
mov byte ptr[ecx+esi*1],32 
;if i put a 'inc esi' here the result is the same 
jmp fine1 

fine1: 

mov dl, byte ptr[ebx+edi*1] 
cmp dl, 0 
je fine2 ;second string finished 
mov byte ptr[ecx+esi*1], dl 
inc edi 
inc esi 
jmp fine1 

fine2: 

;post 
pop esi 
pop edi 
pop ebx 
pop ebp 

ret 

;chiusura della procedura 
_concatena endp 
end 

當我在輸出運行它,我看到:

output

你怎麼看concatena ()放在目標數組中只有第一個字符串... 非常感謝您的每一個答案!

+2

如果你想要一個空間,添加它。如果你不添加它,C不會。這一切都在你的掌控之中。權力是責任。 –

+0

首先以高級語言編寫函數,然後將其翻譯爲程序集。錯誤是你的代碼在沒有混淆的情況下會非常明顯。 – EOF

+0

更好:'無效concatena(const char * stringa,const char * stringa2,char * dest);'和'printf(「%s \ n」,dest);'也許在結束大括號前加上'return 0;' 'main()' – pmg

回答

0

在C中,strcat相當於自動會預先考慮第二個字符串前的空間將是這個樣子:

void strcatspace(char *dest, char *src) 
{ 
    char *insert_point = &dest[strlen(dest)]; 
    *insert_point++ = ' '; 
    while(*src) *insert_point++ = *src++; 
} 

沒有測試,但是這是一般的想法。將此函數轉換爲程序集以實現預期的結果,可能使用編譯器生成的指令作爲起點。

+0

我正在尋找一個裝配解決方案,所以這就是爲什麼我把標籤「masm」,但我不知道你爲什麼刪除它... 謝謝你的答案! –

+0

@AlessandroBarrili因爲您的問題是關於「x86」彙編,而不是專門關於MASM彙編程序。 –

+0

我使用masm語法編寫它... –

0

更proft將下面的代碼:

#include <string.h> 

void strcat_space(char* dest, char* src){ 
    strcat(dest, " "); 
    strcat(dest, src); 
} 

享受

,如果你想傳遞結果thisrd字符串,只是:

#include <string.h> 

int main(){ 
    char str1[] = "abcd"; 
    char str2[] = "efgh"; 
    char dest[1000]; 

    strcat_space(strcpy(dest, str1), str2); 
    /* 
    // or you can also do 
     strcat(dest, str1); 
     strcat_space(dest, str2);  
    */ 

    return 0; 
} 
+0

這是非常低效的。例如,它需要遍歷第一個字符串三次(一次將它複製到dest,一次添加一個空格,一次在空格之後)。註釋掉的替代選項不起作用;當dest以這種方式創建時,dest不一定會被清零(如果是這樣,效率會更低)。我不知道爲什麼OP需要一個彙編解決方案,但我懷疑C方案效率低下。 –

+0

丹尼爾怎麼說:我正在尋找一個裝配解決方案......在C我知道該怎麼做! 謝謝你的回答:) –

0

有許多方面,這可能是完成但一般來說,我喜歡儘可能簡化。在這種情況下,程序框架並不是真正必要的,但是因爲您已將它包含在您的示例中,我也這樣做了。

push ebp 
    mov  ebp, esp 

    push esi 
    push edi 

; So second iteration of MoveStr will drop into Done  
    push Done 

    mov  edi, dword ptr [ebp+16] ; Grab pointer to destination buffer 

    mov  esi, dword ptr [ebp+8] ; Pointer to string 1 
    call MoveStr 
    or  al, ' ' 
    stosb 
    mov  esi, dword ptr [ebp+12] 

MoveStr: 
    lodsb 
    or  al, al 
    jnz  L1 
    ret 
L1: stosb 
    jmp  MoveStr 

Done: 
    pop  edi 
    pop  esi 
    leave 
    ret 
+0

你會怎麼做?我正在學習使用它,所以如果你能教我一個更好的程序...我在這裏:)非常感謝你! –

+0

@AlessandroBarrili Better是一個相對術語,因爲每個人都會有更好的自己的想法。最後,算法是否給你你想要的結果。用這個例子代替你的代碼,然後用調試器追蹤它,你會得到一個真正清晰的想法。學習只是瞭解指令集,然後嘗試使用代碼,然後嘗試調整它以改善空間和/或速度。 –

-1

我找到了解決的辦法! 有人回答/在這裏說,把'dest''esi'(索引)中的第一個字符串指向「行尾」或類似的東西...因此,解決方案非常非常簡單,我減少它,然後增加它..! 它更簡單的把它寫的是解釋,我只改變塔標籤「空間」這樣的:

space: 
dec esi ;decrease 
inc esi ;increase 
mov byte ptr[ecx+esi*1],20h 
inc esi 
jmp fine1 

所以,謝謝大家!

+0

太棒了!你把「downvote」作爲我的回答,但NOBODY給我一個解決方案!也許它是一個粗魯的解決方案,但在asm和工作! –