2014-01-11 88 views
-1

我寫應該字符串數組從使用指針「複製字符串數組從數組」使用指針

#include<stdio.h> 

void copy_string(char *to,char *from); 

void print_array(char *a); 


int main(void) 
{ 
    char *s1="Salahuddin"; 
    char *s2="Ashraf"; 

    print_array(s1); 
    print_array(s2); 

    copy_string(s1,s2); 

    print_array(s1); 
    print_array(s2); 

return 0; 
} 

void print_array(char *a) 
{ 
    while(*a!='\0') 
     printf("%c",*a++); 
    printf("\n"); 
} 

void copy_string(char *to,char *from) 
{ 
    while(*from != '\0') 
    { 
     *to++=*from++; 
    } 
} 

但是這段代碼運行時,只打印陣列複製到另一個陣列的功能的功能一次(在調用copy_string之前)函數,然後退出程序。

我試過調試它,發現當調用copy_string函數時,編譯器會去那裏,檢查* from'='\ 0'條件,然後進入while循環,然後直接進入函數的結尾。我想不出什麼問題是?

任何人都可以幫忙嗎?在此先感謝

+1

有數百個這個問題的重複。 -1沒有努力縮小問題的範圍,或者先嚐試一些簡單的方法,或者使用調試器。 –

回答

1

這裏你最大的問題是s1s2文字字符串,而這些都是恆定的,只讀的。所以你不能在這裏使用普通的指針。

相反,您必須使用數組,例如

char s1[] = "some string"; 
char s2[] = "some other string"; 

你必須做的第二件事是確保目的地有足夠的空間來源字符串。在上面的例子中,並不是

char s1[30] = "some string"; 
char s2[30] = "some other string"; 
+0

是的,它現在和我一起工作,但我有另一點,本書中的這個任務的解決方案建議另一個函數的身體..它對我來說很奇怪 while(* to ++ = * from ++); 你知道它的工作原理,除了「to」字符串被完全刪除並由「from」改變,而在我的函數中它不會刪除整個字符串,它只是改變在「from」字符串中找到的字符數。現在爲什麼它在book函數中刪除了整個「to」字符串,以及它如何處理(* to ++ = * from ++)作爲賦值並在同一時間進行測試? – Salahuddin

0

兩件事情:它可以通過使陣列固定大小迎刃而解

  1. 你必須在你的目的地分配足夠的存儲空間,你有沒有,但在這種情況下, BUT
  2. 您正在修改非常糟糕的字符串文字(編譯器實際上將它們存儲在特殊的地方,或者至少可以,並且寫入到它不存儲它們的位置的地方)。

如果你不斷改變字符串中的字符值,malloc()它新鮮,你可以做到這一點(這也將確保你有足夠的存儲空間)。你不能,但是,說

char *foo = "blah"; 
foo[0] = 'a'; /* WRONG */ 
2
char *s1="Salahuddin"; 
char *s2="Ashraf"; 

有了這個s1s2指向常量字符串並不是一個真正的字符數組。他們的內容不應該改變。

它更新到

char s1[20] ="Salahuddin"; 
char s2[20] ="Ashraf"; 

這裏20僅僅是隨機數,你可能想改變這種狀況。

另外在複製功能中,在字符串的末尾添加。

void copy_string(char *to,char *from) 
{ 
    while(*from != '\0') 
    { 
     *to++=*from++; 
    } 
    *to = '\0'; 
}