北京匠牛科技_(C/C++/数据结构篇2020版)

**1、已知strcpy的函数原型:char *strcpy(char strDest, const char strSrc), 其中strDest是目的字符串, strSrc是源字符串, 不用调用C的字符串函数, 写出函数strcpy(C试题)

char  *strcpy(char *strDest,  const char *strSrc)
{
//前面两个判断是考虑到性能的问题,或者有没有必要走到while
	if ( strDest == NULL || strSrc == NULL)
		return NULL;
	if ( strDest == strSrc)
		return strDest;
	char *tempptr = strDest;
	
	while( (*strDest++ = *strSrc++) != "\0" );
	return tempptr;//char * 类型的返bai回值可du以节省 strDest的内存
}

2、用指针的方法,将字符串 ”ABCD1234efgh”前后对调显示。(C试题)

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char TestString[] = "ABCD1234efgh";
    char *pString = TestString;
    int length = 0;
    
    //计算字符串的长度
    for(int i=0; TestString[i]; i++)
    {
        length++;
    }
    
    //字符串前后对调
    for(int i=0; i<length/2; i++)   //因为是对调,所以调换长度的一半就可以
    {
        char temp;
        temp = (*pString + i);                      //头部的字符保存在temp中
        *(pString + i) = *(pString + length-1-i);   //使用尾部字符覆盖头部字符
        *(pString + length-1-i) = temp;             //使用temp(保存的头部字符)覆盖尾部字符
    }
    //输出显示
    puts(TestString);
    return 0;
}

还有一个写死的方法

#include<stdio.h>
void main()
{
    char a[]="ABCD1234efgh",i,t;
    for(i=0;i<6;i++)
    {
        t=a[i];
        a[i]=a[11-i];
        a[11-i]=t;
    }
    puts(a);
}

在这里插入图片描述
3、用C语言实现字符串转数字函数:int atoi(const char *str)。

  • C语言中,可以使用baiatoi函数将字符串转换为数字,如atoi(“123”)可以得到数字123。 atoi (表示 ascii to
    integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr)
    函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。 如果 nptr不能转换成 int 或者
    nptr为空字符串,那么将返回0。特别注意,该函数要求被转换的字符串是按十进制数理解的。atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1。
  • C语言中数字转化为字符串的方案: 使用sprintf函数来实现,如sprintf("%d", 123)可以得到字符串"123"。
    sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf
    对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用
    snprintf函数,该函数可对写入字符数做出限制。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int i;
    char buffer[256];
    printf("Enter a number: ");
    fgets(buffer, 256, stdin);
    i = atoi(buffer);
    printf("The value entered is %d.", i);
    
    system("pause");
    return 0;
}

在这里插入图片描述
4、LINUX进程的查看命令和时间查看命令。
在这里插入图片描述

在这里插入图片描述
Linux命令大全:https://www.linuxcool.com/

5.针对源文件test.c, 编写一个Makefile。

//test为目标文件(放在左边)  test.c为依赖文件(放在‘ :’g后边),test依赖于test.c
  1 test : test.c
  2         gcc -o test test.c//注意命令前面一定要加Table键
  3 .PHONY : clean  //clean为关键字  为 伪目标,并不会生成临时文件
  4 clean:
  5         rm -f test //命令  前加 Table键
  6         make clean

6、头文件中的#ifndef/define/endif的作用。

防止该头文件被重复引用。

7、简述socket编程中,udp协议服务器和客户端调用的API的过程。

#include<stdio.h>
#include<string.h>
#include<sys/socket.h>//socket
#include<sys/types.h>
#include<netinet/in.h>//struct sockaddr_in
#include<arpa/inet.h>//inet_pton
int main()
{
	//1、创建一个udp套接字
	int sockfd = socket(AF_INET, SOCK_DGRAM,0);
	
	//2、给套接字bind固定的信息
	struct sockaddr_in my_addr;
	bzero(&my_addr,sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(8000);//自身端口
	//INADDR_ANY 让系统自动寻找可用的本地IP地址
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY==0
	bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
	
	//2、发送数据
	//定义一个IPv4 目的地址结构 192.168.0.110 8080
	struct sockaddr_in dst_addr;
	//清空结构体
	//memset(&dst_addr,0,sizeof(dst_addr));
	bzero(&dst_addr,sizeof(dst_addr));
	dst_addr.sin_family = AF_INET;//协议
	//将主机字节序转换成网络字节序
	dst_addr.sin_port = htons(8080);//端口
	//将字符串"192.168.0.110" 转换成32位整形数据 赋值IP地址
	inet_pton(AF_INET,"192.168.0.110", &dst_addr.sin_addr.s_addr);
	
	sendto(sockfd,"hehe",strlen("hehe"),0, \
	(struct sockaddr *)&dst_addr , sizeof(dst_addr) );
	sleep(1);
	sendto(sockfd,"haha",strlen("haha"),0, \
	(struct sockaddr *)&dst_addr , sizeof(dst_addr) );
	//3、关闭套接字
	close(sockfd);
	return 0;
}

1、创建socket套接字。
2、IPv4套接字地址结构sockaddr_in

struct in_addr
{
    in_addr_t s_addr;//4字节
};
//IPv4地址结构
struct sockaddr_in
{
    sa_family_t sin_family;//2字节  协议
    in_port_t sin_port;//2字节   端口PORT
    struct in_addr sin_addr;//4字节  IP地址
    char sin_zero[8]//8字节 必须为0
};

3、通用地址结构:struct sockaddr
4、sendto函数 发送udp数据
5、bind 函数 让套接字拥有一个固定的IP、端口信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值