2011-11-03 37 views
0

這可能聽起來有點笨,但是很混亂。 我知道strlen()會返回c中字符數組的大小。但是與角色的指向有不同之處。 這是我的代碼:c中的strlen函數

void xyz(char *number) 
{ 
    int i = 0; 
    int length = strlen(number) - 2; 
    while(i <= length) 
    { 
     printf("Number[]: %c",number[i]); 
     i++; 
    } 
} 

這將打印整個號碼我輸入(例如:12345),但如果我刪除了-2的結果是不一樣的。 有誰能告訴我我錯過了什麼?

+4

你是怎麼調用這個函數的?你如何初始化「我」?你可能會更清楚地理解,如果你改變這樣的行:'printf(「Number [%d]:%c \ n」,i,number [i]);' –

+5

'初始化?另外'我'應該通常是<'長度'不<=。 – AusCBloke

+0

@ user1026764:strlen()不會返回c中字符數組的大小,它將返回它的長度。非空字符的數量。 – eyalm

回答

6

很有可能你正在使用fgets或類似的輸入函數獲得一個字符串。在這種情況下,最後可能還會有換行符。

如果臨時更改代碼:

void xyz (char *number) { 
    int i = 0, length = strlen (number); 
    while (i < length) 
     printf ("Number[%d]: %c (%d)", i, number[i], number[i]); 
     i++; 
    } 
} 

也應尊重所有字符的數字代碼。

在你的函數編碼類似的東西- 2的問題是,它不會與工作:

xyz ("123"); 

,因爲它會提前停止,打印出只有12調用者應該使用有效數據調用,這意味着它應該在調用之前將該值調整爲數字字符串。


您可以在下面的程序看到這種情況出現:

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

void xyz (char *number) { 
    int i = 0, length = strlen(number) - 2; 
    while(i <= length) 
    { 
     printf("Number[%d]: %c (%d)\n",i, number[i], number[i]); 
     i++; 
    } 
    puts ("==="); 
} 

void xyz2 (char *number) { 
    int i = 0, length = strlen(number); 
    while(i < length) 
    { 
     printf("Number[%d]: %c (%d)\n",i, number[i], number[i]); 
     i++; 
    } 
    puts ("==="); 
} 

int main (void) { 
    char buff[100]; 
    printf ("Enter number: "); 
    fgets (buff, sizeof (buff), stdin); 
    xyz (buff); 
    xyz ("12345"); 
    xyz2 (buff); 
    xyz2 ("12345"); 
    return 0; 
} 

這樣做的(annoted)輸出,如果輸入98765是:

Enter number: 98765 
Number[0]: 9 (57) 
Number[1]: 8 (56) 
Number[2]: 7 (55) # Your adjustment works here because of the newline. 
Number[3]: 6 (54) 
Number[4]: 5 (53) 
=== 
Number[0]: 1 (49) 
Number[1]: 2 (50) 
Number[2]: 3 (51) # But not here, since it skips last character. 
Number[3]: 4 (52) 
=== 
Number[0]: 9 (57) 
Number[1]: 8 (56) 
Number[2]: 7 (55) # Here you can see the newline (code 10). 
Number[3]: 6 (54) 
Number[4]: 5 (53) 
Number[5]: 
(10) 
=== 
Number[0]: 1 (49) 
Number[1]: 2 (50) 
Number[2]: 3 (51) # And proper numeric strings work okay. 
Number[3]: 4 (52) 
Number[4]: 5 (53) 
=== 

如果你正在尋找一個強大的用戶輸入函數來解決這個問題(並且避免像無界的這樣的危險事情和gets),我在其他地方有一個SO(實際上是HERE),它是從我的兵工廠中抽取的。

+0

這是輝煌的東西。感謝很多人^ _^ – noMAD

+0

你的代碼工作yar ..你應該不得不初始化我= 0和它的作品我檢查。你想刪除最後2個字符? –

1

檢查這是否適合你 -

void xyz(char *number) 
{ 
    int length = strlen(number); 

    while(i < length) 
    { 
     printf("Number[]: %c",number[i]); 
     i++; 
    } 
} 

這個功能,如果援引爲

xyz("1234"); 

應該打印出來:

Number[]: 1 
Number[]: 2 
Number[]: 3 
Number[]: 4 

是你真正想要的是什麼?如果是這樣,那麼讓我指出2個錯誤。

1)「i」未初始化。這是一個好習慣的問題。顯式初始化你的循環控制變量(在這種情況下爲零),只是不要假設它被設置。 2)你的while循環條件與「< =」運行1個額外的週期,它應該。

記住陣列從索引開始「0」(零),並且尺寸10的陣列,具有從0到9有效的索引,和C朗使用空字符(「\ 0」),以終止的字符串。因此,您的 「1234」 實際存儲爲: -

串[0] = '1' 串[1] = '2' 串[2] = '3' 串[3] =「4 ' 串[4] = '\ 0'(< = NULL)

因此,如果您的環路計數器(控制變量)1在循環的開始= 0,對於第一次迭代,則挑串[0],並且對於第二次迭代(i = 1時),你挑字符串[1] ...和這樣的循環應該只運行4次,即當我== 4(即循環計數器<字符串長度),則必須停止&退出循環。

希望這清除了您的疑問和幫助。如果是這樣,請不要忘記接受答案。

0

strlen()返回字符串的長度,但C數組,因而串,被零索引。所以你想增加,直到你達到strlen() - 1。你可以做到這一點無論是從一箇中減去你的長度,並用低於或相等測試 - <= - 在你的while循環,也可以只使用strlen()並繼續你的循環,只要你的計數器是不是嚴格地少你的長度。

誤差的可能來源:

  1. 如果你不初始化i,賠率是它無論從任何先前在該存儲器位置將遠高於長度得到的值。所以你的while條件在第一次執行時會失敗。
  2. 如果晃過字符串的結尾,你會看到一個NULL字符 - '\0' - 在字符串的結尾,並隨機垃圾過去那種。
0

我的猜測是你使用fgets來讀取一些輸入。如果是這種情況,當您輸入「12345」並按回車鍵,您的緩衝區將如下所示:

{'1','2','3','4','5','\ n ','\ 0'}

正如你可以看到有字符,我們不想要。所以,我們可以一開始做的是從你的緩衝區的末尾砍下換行符char'\n'

所以假裝這是我們如何在輸入閱讀:

int main(void) 
{ 
    char buff[20]; 
    fgets(buff, 20, stdin); 

    buff[strlen(buff) - 1] = '\0'; /* remove the '\n' */ 
    xyz(buff); 
} 

現在討厭換行符不會有什麼看起來像空的輸出循環的最後一次迭代將會消失。現在對於xyz

void xyz(char *number) 
{ 
    int i, length = strlen(number); 
    for (i = 0; i < length; i++) 
     printf("Number[%d]: %c", i, number[i]); 
} 

注意,我們現在減去長度什麼是。這有兩個原因:第一個是我上面提到的換行符,第二個是因爲條件現在是< length而不是<= length(我在上面的評論中提到過)。<= length意味着我們將在字符串末尾讀取1('\ 0'字符),因爲第一個索引是number[0],最後一個是number[length - 1]

1

我這樣做,並收到類似這樣的輸出:

strlen(number)-2移除最後一個零和的最後一個字符,其中包含4

輸出:

Number[]: 1 
Number[]: 2 
Number[]: 3 

代碼:

int main() 
{ 
    xyz("1234"); 
} 
void xyz(char *number) 
{ 
    int i=0; 
    int length = strlen(number) - 2; 
    while(i <= length) 
    { 
     printf("\nNumber[]: %c",number[i]); 
     i++; 
    } 
} 

它的工作原理,你必須初始化i

0

你真要做:

int length = strlen(number) - 1; 

要得到正確的輸出。

另外,你必須記住你正在傳遞一個字符數組到你的xyz函數。所以,如果你做了以下事情:

xyz("12345") 

你的長度將是5個字節。在您的while循環中,您的number[i]索引實際上從0開始,而不是1,因此您需要減去1以獲得正確的結果,因此您使用int length = strlen(number) - 1