2015-02-11 60 views
0

我需要編寫一個簡單的程序(沒有花哨的指針,沒有庫函數,用於教育目的),它從用戶讀取第一個和第二個名字並將它們打印出來由空格分隔的單行。我沒有得到的結果,我不知道爲什麼:在不使用庫函數的情況下在C中連接字符串

# include <stdio.h> 
//the program loosely simulates the behaviour of strcpy 
main(){ 
    char fname[16], sname[16], cat[31]; 
    int i, j; 
    printf("Please enter your first name: "); 
    scanf("%s", fname); 
    printf("Please enter your second name: "); 
    scanf("%s", sname); 

    for (i=0; fname[i] != '\0'; cat[i++] = fname[i++]) 
     ; 

    cat[i+1] = ' '; //adds a space between the tokens 

    for (j=i+1; sname[j] != '\0'; cat[j++] = sname[j++]) 
     ; 

    printf("The final result is:\n%s", cat); 
    return 0; 
} 
+0

你'J = + 1',然後使用'SNAME [J ++ ]'---你正在訪問'sname'越界,加上一些UB(見下一篇文章)等等。至少,我在這裏發現了3個左右的錯誤。 – 2015-02-11 19:49:46

+5

'貓[i ++] = fname [i ++]'可能不會達到您的預期。 'cat [i] = fname [i],i ++'更安全。 – 2015-02-11 19:50:14

+2

@squeamishossifrage:或者他可以將賦值放在它所屬的for循環的(當前爲空)體中。 – 2015-02-11 19:52:16

回答

1

你有幾個問題。首先,由於cat必須足夠大以容納前兩個字符串它們之間的空格,因此應聲明cat[32] - 名字15個字符,姓氏15個字符,1個空格和1個空尾字節。

你在錯誤的地方放置單詞之間的空格。第一個循環左i持有cat下一個位置,所以它應該是:

cat[i] = ' '; 

接下來,在第二循環中的數組索引是不正確的。 cat中的位置是正確的,因爲它們從您離開前一個循環的位置開始。但是您需要從0開始sname。所以,這個循環應該是:

for (j = i+1, k = 0; sname[k] != 0; cat[j++] = sname[k++]) 
    ; 

最後,串聯兩個字符串後,你需要一個空字節追加到結果,表明結束。

cat[j] = 0; 

的另一個問題是,你i每次遞增兩次通過第一循環,因爲你使用cat[i++] = fname[i++]。這些i++中的每一個都會增加變量。您需要分配從增量分開:

for (i=0; fname[i] != '\0'; i++) { 
    cat[i] = fname[i]; 
} 

下面是腳本的最終版本的作品:

# include <stdio.h> 
//the program loosely simulates the behaviour of strcpy 

int main() { 
    char fname[16], sname[16], cat[32]; 
    int i, j, k; 
    printf("Please enter your first name: "); 
    scanf("%s", fname); 
    printf("Please enter your second name: "); 
    scanf("%s", sname); 

    for (i=0; fname[i] != '\0'; i++) { 
     cat[i] = fname[i]; 
    } 

    cat[i] = ' '; 

    for (j = i+1, k = 0; sname[k] != 0; cat[j++] = sname[k++]) { 
    } 

    cat[j] = 0; 

    printf("The final result is: %s\n", cat); 
    return 0; 
} 
+0

你的意思是'貓'應該用'32'字符聲明,對吧?因爲它已經包含'31'單元。你的分析看起來很平常,然而當我運行你的修正版本時,我得到了兩頁錯誤,程序甚至沒有編譯。 – 2015-02-11 20:09:54

+0

對,對不起。你遇到了什麼錯誤? – Barmar 2015-02-11 20:11:24

+0

它抱怨很多事情,並不清楚它出錯的地方。它例如說:'預期的聲明說明符或'...'在'fname'之前,並且在其他地方說'錯誤:無效的初始化程序'。這裏是更正後的代碼:http://paste.ofcode.org/38aK7vqBuYUMirpbbNKGpZ6 – 2015-02-11 20:17:15

0

我知道你爲自己設定一個挑戰,嘗試學習如何做一些具體的事情(我看你正在朝着自己的目標前進)。但我總是想記住有很多方法可以完成工作 - 尤其是在C中。你知道你可以用printf來做到這一點,對吧?

char fname[16], sname[16]; 
int i, j; 
printf("Please enter your first name: "); 
scanf("%s", fname); 
printf("Please enter your second name: "); 
scanf("%s", sname); 

printf("%s %s\n", fname, sname); 
+0

是的,我實際上應該使用數組操作來做到這一點。 – 2015-02-11 19:52:26

0

關注的指數使用:

cat[i++] = fname[i++]cat[j++] = sname[j++]

嘗試增加 '我' 和你的循環結束 'J':

for (i=0; fname[i] != '\0'; ++i) 
    cat[i] = fname[i]; 
// ... 
for (j=0; sname[j] != '\0';++j) 
    cat[j+i+1] = sname[j]; 
相關問題