0

我想要一个用户定义的函数,它等效于 C 中的 strlen() 函数。在下面的程序中,它的功能与 strlen() 相同,但它有一个限制。我怎样才能让它计算任何长度的文本。

#include <stdio.h>
#include <conio.h>
void main()
{
    int len(char *);
    char s[20];
    int l;
    printf("Enter a string: ");
    gets(s);
    l=len(s);
    printf("length of string is =%d",l);
    getch();
}

int len(char *t)
{
    int count=0;
    while(*t!='\0')
    {
        count++;
        t++;
    }
    return(count);
}
4

5 回答 5

2

我认为您的“限制”是因为您使用gets()了 20 个字节的缓冲区。由于缓冲区溢出,您将遇到问题。当你这样做时会发生什么并不完全可以预测。

如果你解决了这个问题,我认为你的功能会像你期望的那样工作。(阅读其他人的答案以了解您的长度函数。)

于 2012-02-05T01:33:59.927 回答
1

如果你真的想要“任意长度”,你需要一个任意精度的整数库(例如 libgmp)作为计数器。但是,这是非常不合理的,因为字符串必须适合您的记忆,并且每个字符实际上都必须有一个地址。也就是说,适合可寻址空间的任何字符串的长度都可以用类型变量表示size_t(或者unsigned long int,我想;它的大小与机器的寄存器大小相同)。

(请不要问如何形成填充整个可寻址内存的字符串的结束指针。)

于 2012-02-05T01:18:30.440 回答
0

它的极限是int界限。如果增加它,请使用long. 此外,使其无符号以使最大值加倍。如果您想确保它适合,请使用size_t(原始strlen用途)

顺便说一句,永远不要使用gets.

于 2012-02-05T01:18:57.950 回答
0

你想要的极限是多少?从历史上看,字符串由 '\0' 终止,因为它是知道字符串结束位置的唯一方法,否则您实际上可以读取整个堆栈或堆超过字符串的真实长度。其他函数用来识别字符串结尾的一种方法是在找到字符集之外的值时停止读取,以防止崩溃而不是作为一项功能。

编辑: 显然我误解了这个问题。

于 2012-02-05T01:19:24.107 回答
-1
int main(){


    int Length = 0;
    char StrArray[10] = "Hello";

    while (StrArray[Length] != '\0')
    {
        StrArray[Length];
        Length++;
    }

    std::cout << Length;

    std::cin.get();

}
于 2015-03-02T10:55:24.117 回答