C语言三种方法实现strlen函数(源码和讲解)

 C语言函数库中的strlen函数表明,传入一个char类型的指针,返回一个size_t类型(unsigned int)的返回值,并且此函数只能用于字符串不能用于数组,下面我们就用三种方法来模拟实现一下strlen函数。

1.计数器方法

事先解释一下assert函数是为了防止变量str为空,用此函数需声明assert.h文件。

模拟C语言函数库来定义一个my_strlencou函数(名字随便起),并在函数内定义一个无符号类型的变量count,再次利用while循环来找字符串中的‘\0'字符(此字符是创建字符串时自动添加的),如果不是\0'字符,count就加1,如果找到\0'字符就跳出循环并返回count。while (*str++) count++;这句换就是while(*str){count++; str++}

//计数器方法
size_t my_strlencou(const char* str)
{
	assert(str);
	size_t count = 0;
	while (*str++) count++;
	return count;
}

 2.指针-指针

以为字符串时char*类型的,char在内存中占一个字符,在定义字符串时char[],也可以理解为定义一个char类型的数组,并在数组最后方多放一个’\0'字符,这样我们就可以用循环来找到‘\0'在内存中的位置,因为在找寻'\0'字符时地址值会发生变化,所以我们就要多定义一个字符地址sopystr来拷贝原str地址,再用新创建的copystr经行差找'\0',最后再用’\0'的地址减去原str的地址再减一(这里减一是减去‘\0'的地址,返回时不算'\0')就可以了。

//指针-指针
size_t my_strlenpoin(const char* str)
{
	assert(str);
	char* copystr = str;
	while (*copystr++);
	return copystr - str - 1;
 }

3.递归的方法

我们先拿到一个字符地址,之后就返回数字1和本函数的调用 ,盗用的函数实参就是str加一,(str加一就是字符串中下一个字符的地址值),再给函数写一个停止调用的功能,我们让此函数在str地址值指向’\0'时我们就停止调用本函数,并返回一个数字0(因为'\0'不算长度),这样我们的函数就完成了。

//递归的方式
size_t my_strlenrecu(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return my_strlenrecu(++str) + 1;
}

 4.创建函数内计算的方法

此方法算是拓展,因为此方法只能在定义字符串变量的方法内使用,如果定义的字符串被传值到其他的方法内,再使用此方法就不行了。

方法就是简单的计算用C语言中自带的sizeof函数先算出字符串的总大小,再用sizeof算出字串中任意一个字符的大小,再相除减一(减一减的是‘\0’字符所占总字符的大小,取字符串内任意字符:我们可以把字符串看成一个字符数组,就是再数组组后放加一个‘\0’,所以用字符数组中arr[0],在字符串中也能用。

int main()
{
	char arr[] = "adffgg" ;
	int len = sizeof(arr) / sizeof(arr[0]) - 1;
	printf("%d", len);
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TCP通信心跳包是在TCP连接中发送的一种探测包,用于检测连接是否仍然存活。下面是一个用C语言实现的TCP通信心跳包的简单示例源码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <errno.h> #define PORT 8080 #define MAX_BUFFER_SIZE 1024 #define HEARTBEAT_INTERVAL 10 // 心跳包发送间隔,单位为秒 int main() { int sockfd; struct sockaddr_in serverAddr; char buffer[MAX_BUFFER_SIZE]; int len; int heartbeatCount = 0; // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("Fail to create socket"); exit(errno); } // 初始化服务器地址 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = inet_addr("服务器IP地址"); // 连接服务器 if (connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { perror("Fail to connect server"); exit(errno); } // 开始心跳包通信 while (1) { // 发送心跳包 sprintf(buffer, "Heartbeat: %d", heartbeatCount); len = send(sockfd, buffer, strlen(buffer), 0); if (len < 0) { perror("Fail to send heartbeat"); exit(errno); } // 接收服务器返回数据 len = recv(sockfd, buffer, sizeof(buffer), 0); if (len < 0) { perror("Fail to receive data"); exit(errno); } else if (len > 0) { buffer[len] = '\0'; printf("Receive from server: %s\n", buffer); } // 延时一段时间再发送下一个心跳包 sleep(HEARTBEAT_INTERVAL); heartbeatCount++; } // 关闭连接 close(sockfd); return 0; } ``` 以上示例代码实现了一个客户端程序,使用了socket库函数进行TCP连接的创建和通信。程序中通过send函数发送心跳包数据,然后通过recv函数接收服务器返回的数据,然后延时一段时间后再次发送心跳包。这样循环进行,实现了TCP通信的心跳包功能。请注意替换代码中的"服务器IP地址"为实际的服务器IP地址。 ### 回答2: 以下是一个基于C语言实现的TCP通信心跳包的源码示例: #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define BUFFER_SIZE 1024 #define HEARTBEAT_INTERVAL 5 void send_heartbeat(int sockfd) { char heartbeat_msg[] = "heartbeat"; send(sockfd, heartbeat_msg, strlen(heartbeat_msg), 0); } int main() { int sockfd; struct sockaddr_in server_addr; // 创建套接字 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Failed to create socket"); exit(1); } // 设置服务器地址结构 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, SERVER_IP, &(server_addr.sin_addr)) <= 0) { perror("Invalid server IP address"); exit(1); } // 连接服务器 if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("Failed to connect to server"); exit(1); } // 设置心跳定时器 int heartbeat_timer = 0; while (1) { // 发送心跳包 if (heartbeat_timer >= HEARTBEAT_INTERVAL) { send_heartbeat(sockfd); heartbeat_timer = 0; } // 接收服务器响应 char buffer[BUFFER_SIZE]; int recv_size = recv(sockfd, buffer, BUFFER_SIZE, MSG_DONTWAIT); if (recv_size > 0) { // 处理服务器响应 buffer[recv_size] = '\0'; printf("Received message: %s\n", buffer); } // 模拟其他业务操作 printf("Do something else...\n"); // 更新心跳定时器 sleep(1); heartbeat_timer++; } // 关闭套接字 close(sockfd); return 0; } 这段代码中,首先创建了一个套接字(socket),然后设置服务器地址结构,使用 connect 函数连接到服务器。之后,通过一个循环来完成心跳包的发送和接收服务器响应的操作。其中,发送心跳包的函数 send_heartbeat 会在一定时间间隔内被调用,并使用 send 函数将心跳包数据发送到服务器。接收服务器响应则使用 recv 函数,并使用 sleep 函数来控制心跳时间间隔。整个循环会不断重复,直到程序被终止。最后,关闭套接字并返回。 ### 回答3: 以下是一个使用C语言实现的TCP通信心跳包的简单源码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 9999 #define HEARTBEAT_INTERVAL 5 void heartbeat(int sockfd) { char *msg = "Heartbeat"; while (1) { if (send(sockfd, msg, strlen(msg), 0) < 0) { perror("Error sending heartbeat"); break; } sleep(HEARTBEAT_INTERVAL); } } int main() { int sockfd; struct sockaddr_in server_addr; // 创建socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Error creating socket"); exit(EXIT_FAILURE); } // 设置server_addr结构 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) { perror("Error setting server address"); exit(EXIT_FAILURE); } // 连接到服务器 if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("Error connecting to server"); exit(EXIT_FAILURE); } // 启动心跳包发送 heartbeat(sockfd); // 关闭socket连接 close(sockfd); return 0; } ``` 以上代码实现了一个TCP客户端,每5秒向服务器发送一次心跳包。这个心跳包中包含一个固定的字符串"Heartbeat"。首先,代码创建一个socket并设置服务器的IP地址和端口号。然后,通过connect函数与服务器建立连接。之后,在一个无限循环中,使用send函数发送心跳包字符串,然后通过sleep函数等待5秒。如果发送失败,则会输出错误信息并退出循环。最后,当循环退出后,关闭socket连接。 请注意,这只是一个简单的心跳包示例,实际应用中可能需要根据具体需求对其进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值