2016-04-22 87 views
1

爲什麼不strlen()返回一個確切的值?
例如,當我輸入123時,它返回2.對於12345,它返回1.爲什麼?爲什麼strlen()每次都返回2或1?

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    long int ui,remainder,i=0,len; 
    char binary[20]; 
    scanf("%ld",&ui); 
    while(ui!=0) { 
     remainder=ui%2; 
     binary[i]=(char)remainder; 
     printf("%d ",remainder); 
     ui=ui/2; 
     i++; 
    } 
    binary[i]='\0'; 
    printf("len is %ld\n",strlen(binary)); 
    for(i=len-1;i>=0;i--) printf("%d",binary[i]); 
    return 0; 
} 

回答

2
strlen

返回字符數組的長度,直到找到字符'\0'(與數值0)在它。您的binary數組是字符數組,但您將它們視爲整數,因爲您要存儲數字值01。計算長度時,strlen會在找到您寫的第一個0時停止。

要得到你需要的答案,binary定義修改爲char binary[20] = { 0 };,保存remainder值作爲ASCII字符(binary[i] = '0' + (char)remainder;),並將其打印爲字符printf("%c ",binary[i]);

2

它不工作的原因是因爲如何您正在使用binary

strlen函數旨在對NULL終止的字符串進行操作。但binary不是作爲字符串進行處理,而是作爲字節數組進行處理。

strlen函數搜索直到找到空字節,即值爲0的字節。在「123」的情況下,值0出現在兩個字節之後。在「12345」的情況下,值0在一個字節之後出現。這解釋了你得到的輸出。

此外,您正在使用len而無需初始化它。這導致未定義的行爲。在退出while循環後,您要將其設置爲i。您還需要將第一個printf的格式說明符從%d更改爲%ld,因爲remainder被聲明爲long int

2

這裏有一些問題,binary是一個char,所以它的'0'值也打印出來;

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    long int ui,remainder,i=0,len; 
    char binary[20] = {0}; 
    scanf("%ld",&ui); 
    if (ui==0) { binary[i] = '0'; i++; } // Special case for zero 
    while(ui!=0) { 
     remainder=ui%2; 
     binary[i]=(char)remainder + '0'; 
     printf("%d ",remainder); 
     ui=ui/2; 
     i++; 
    } 
    binary[i]='\0'; 
    printf("len is %ld %s\n",len = strlen(binary), binary); 
    for(i=len-1;i>=0;i--) 
     printf("%c",binary[i]); 
    return 0; 
} 

對於我的下方運行我

0 0 0 0 0 1 len爲6 000001

+0

如果輸入是' 「0」',所述輸出是'「len是0 \ n」'。 – chux

+0

沒有比特需要代表零我猜... – cleblanc