2014-06-13 63 views
0

好吧,我是初學者在CI被認爲是一個數組來保存到需要的字符聲明爲:陣列不需要的字符

char a[10]; 

所以我會從(0〜9的10個元素) 但它不是working.It是給我不需要characters.Can你告訴我這個問題is.My代碼:

#include<stdio.h> 
#include<stdlib.h> 
int main(void) 
{ 
    printf("%s",rand_string()); 
} 
int rand_string(void) 
{ 
    srand(time(NULL)); 
    char a[7]; 
    int e; 
    int d; 
    a[0]='l'; 
    a[1]='o'; 
    a[2]='n'; 
    a[3]='g'; 
    a[4]=' '; 
    d=(rand()%6) + 97; 
    a[5]=d; 
    e=(rand()%10) + 48; 
    a[6]=e; 
    printf("\n%s\n",a); 
    return a; 
} 

我得到這樣的結果: 長F99 |/

我想到: 長F9

好了,所以我總共有4個問題: *如何解決的不想要的字符的問題,爲什麼它給unwated字符? *我的生成隨機數的方式是否有限制? *如何在一行中寫出前4個字母「long」而不是數組中的每行? *如何組合2個字符串?

+0

'rand_string()'應該聲明爲返回'char *',這就是它在內部所做的事情。顛倒'main()'和'rand_string()'的順序以避免未聲明的警告。作爲初學者,你應該啓用所有警告來捕捉這些簡單的錯誤。 – wallyk

+0

雖然問題得到解答。您還可以在C中查找「memset」函數。0123> – Ajit

+0

其他次要位:1)不是添加「48」,而是使用「0」。它更便於攜帶,使代碼更易於理解。 「a」和「97」相同。 2)建議確保'srand(time(NULL));'只被調用一次。也許轉到'main()'。 – chux

回答

1

第一個問題已經由Carl Norum回答。

  • 我的方式產生隨機數的限制好嗎?

    是的,但是定義一個函數會很好,不是嗎?儘管像a[0] = randomBetween(97, 102);這樣的調用更具可讀性。

    編輯:正如在評論上述:你甚至可以寫

    a[0] = randomBetween('a', 'f');只是一點點更具可讀性;-)

  • 怎麼寫的第4個字母「長」在一個線而不是數組中的每一行?

    有沒有辦法,而不是你可以複製循環中的元素或使用像memcpy,strcpy這樣的功能。以單詞形式提出您的問題:

    a[0] = 'l'; a[1] = 'o'; a[2] = 'n'; a[3] = 'g'; 
    

    但是,這不是你想要的,我猜:-)另請參見下面的strcpy示例。

  • 如何結合2個字符串?

    同樣,無論使用一個循環或上面提到的功能:使用例如

    char *first = "Hello "; 
    char *second = "World"; 
    char combined[12]; 
    int currentIndex = 0, i = 0; 
    
    // copy characters from "first" as long we did not find a \0 
    while(first[i] != 0) 
        combined[currentIndex++] = first[i++]; 
    
    i = 0; 
    
    // copy characters from "second" as long we did not find a \0 
    while(second[i] != 0) 
        combined[currentIndex++] = second[i++]; 
    
    // finally don't forget to null-terminate! 
    combined[currentIndex] = 0; 
    

    strcpy更容易;-)

    char *first = "Hello "; 
    char *second = "World"; 
    char combined[12]; 
    
    strcpy(combined, first); 
    strcpy(&combined[6], second); 
    

    我們在這做什麼?第一個strcpy調用只是「第一個」到「組合」。但第二個電話似乎很有趣。在那裏我們複製「第二」到第七位(從0開始計數,爲此6)。在第一次函數調用之後,這個位置是\0-字符。但我們不希望字符串在這裏結束,所以我們用第二個字符串的第一個字符覆蓋它。一件好事是,strcpy會自動複製結尾處的\ 0。很簡單,不是嗎?

+0

哇!這是一個了不起的答案。謝謝 –

+0

「a [0] = randomBetween('a','f');只是一點點可讀性;-)」 - 你能給我一個如何生成隨機字符的例子到F? : –

+0

我不明白你的問題很好。 'randomBetween('a','f');'正是這樣做的:從a到f生成隨機字符。你什麼意思? :-) – user2084865

5

您需要NULL terminate您的字符串。將數組擴展一個並在其中添加a[7] = 0;,然後您將被設置。

編輯提示:您的程序有另一個問題在於您正在返回一個指向局部變量的指針。您可能需要更改rand_string以代替main填寫緩衝區。以下是這兩種修改的一個簡單示例:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

void rand_string(char a[8]) 
{ 
    srand(time(NULL)); 
    int e; 
    int d; 
    a[0]='l'; 
    a[1]='o'; 
    a[2]='n'; 
    a[3]='g'; 
    a[4]=' '; 
    d=(rand()%6) + 97; 
    a[5]=d; 
    e=(rand()%10) + 48; 
    a[6]=e; 
    a[7]=0; 
    printf("\n%s\n",a); 
} 

int main(void) 
{ 
    char buffer[8]; 
    rand_string(buffer); 
    printf("%s", buffer); 
    return 0; 
} 
+0

謝謝,但我沒有收到編輯筆記。請你詳細解釋一下。我沒有理解我的錯。 –

+0

哦,一兩件事,而不是書面方式:無效rand_string(CHAR一個[8]) {...} 如果我這樣寫: 字符rand_string(CHAR一個[8]) {...} 它爲什麼會給我一個錯誤? –