2016-04-22 194 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