**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、端口信息