很有可能你正在使用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),它是從我的兵工廠中抽取的。
你是怎麼調用這個函數的?你如何初始化「我」?你可能會更清楚地理解,如果你改變這樣的行:'printf(「Number [%d]:%c \ n」,i,number [i]);' –
'初始化?另外'我'應該通常是<'長度'不<=。 – AusCBloke
@ user1026764:strlen()不會返回c中字符數組的大小,它將返回它的長度。非空字符的數量。 – eyalm