2017-06-13 80 views
-1
#include<stdio.h> 
int copy(char d[],char e[],int n); 
int main(void) 
{ 

    char a[20]="Nice to meet you"; 
    char b[10]; 
    copy(a+5,b,4); 
    return 0; 
} 

int copy(char d[],char e[],int n) 
{ 
for(int i=0;i<n;i++) 
    { 
    e[i]=d[i]; 
    } 
printf("%s\n",e); 
return 0; 
} 

這裏da+5e指向b。在這裏,我明白輸出將是「to m」。 我的問題是:在copy函數,如果我初始化i運行從1n-1而不是0n-1,爲什麼它沒有給出所需的輸出? 我預計新輸出爲「o m」。複製子陣列到另一個數組

+6

字符串e上沒有0終止,因此這是未定義的行爲。 – John3136

+0

您的變量和參數名稱不會向讀者提供關於哪個是哪個的提示。像'd'和'e'這樣的名字 - 這些是什麼意思?哪個是「源」,哪個是「目標」?是的,我知道我可以閱讀功能代碼並找出它,但名稱的目的是爲了使這些事情清楚。 –

+0

'char b [10];' - >'char b [10] = {0};' – BLUEPIXY

回答

2

如果循環使用icopy1n - 1,然後調用maincopy(a + 5, b, 4)後,b[0]仍然會未初始化,所以訪問它是未定義的行爲(你是不是要確保在b字符串中'\0'結束,或者)。即使不是,它仍然會在那裏;爲了打印「om」,您必須從b + 1開始閱讀,或者在copy(如e[i - 1] = d[i])中進行分配(並且確保在打算將其視爲字符串之後或將其視爲一個以nul結尾的字符串會將其讀取到未初始化的區域,並類似地調用未定義的行爲)。

相關問題