为什么strlen()每次返回2或1?

时间:2016-04-22 17:57:19

标签: c

为什么strlen()没有返回确切的值?
例如,当我输入123时它返回2.对于12345,它返回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;
}

3 个答案:

答案 0 :(得分:2)

.htaccess返回字符数组的长度,直到找到字符strlen(带有数值'\0')。您的0数组是一个字符数组,但您将它们视为整数,因为您正在存储数值binary0。在计算其长度时,1会在找到您编写的第一个strlen时停止。

要获得所需答案,请将0定义更改为binary,将char binary[20] = { 0 };值保存为ASCII字符(remainder),然后将其打印为字符{ {1}}

答案 1 :(得分:2)

它无法正常工作的原因在于您使用binary的方式。

strlen函数用于对NULL终止的字符串进行操作。但binary不是作为字符串处理,而是作为字节数组。

strlen函数搜索直到找到空字节,即值为0的字节。在“123”的情况下,值0出现在两个字节之后。在“12345”的情况下,值0出现在一个字节之后。这解释了你得到的输出。

此外,您正在使用len而未初始化它。这导致未定义的行为。退出i循环后,您希望将其设置为while。您还需要将printf的第一个%d的格式说明符更改为%ld,因为remainder被声明为long int

答案 2 :(得分:2)

这里有一些问题,二进制是一个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;
}

为了我的运行,我得到了

32

0 0 0 0 0 1 len是6 000001

100000