动态 版块 发帖 消息 我的
小绿叶技术博客
小绿叶技术博客
子版块
admin
773
#--- cmake.sh ---##!/bin/bash # 自动化编译 c/c++ dir=`pwd` ; echo "欢迎使用自动化汇编程序,当前路径为: $dir" RunAppList[0]="xunhuan" RunAppList[1]="mian" RunAppList[2]="cs" CAppList[0]="xunhuan.c" CAppList[1]="mian.c" CAppList[2]="cs.c" RunApp=${RunAppList[2]} CApp=( ${CAppList[2]} ) touchCMake(){ sudo touch CMakeLists.txt ; sudo chmod 777 CMakeLists.txt ; echo " project(eisc) #项目名 cmake_minimum_required(VERSION 3.10) # 编译要求:cmake 要大于最低版本 3.1 set(CMAKE_C_COMPILER "gcc") set(CMAKE_CXX_COMPILER "g++") # 设置编译器, 如果没有配置环境变量,可以改为gcc具体文件路径 include_directories(a) include_directories(a) # 添加 头文件搜索路径 (mysql.h 搜索路径) add_executable($RunApp ${CApp[*]} ) #add_executable($RunApp ${CApp[*]} ) # 生成可执行文件: 将 test.cpp 编译成 test.exe 可执行文件 # rm -rf ./build ; cmake ./ -Bbuild -G "Unix Makefiles" ; cmake --build build # rm -rf ./build ; cmake ./ -Bbuild ; cmake --build build # 编译到当前目录下的 build 文件夹 # 也可以不用指定 -G " > CMakeLists.txt # 如果 echo 字符串中有 变量,需要加反斜线转义 } autoINCPath(){ incList[0]="include_directories($dir/include/inc/)" incList[1]="include_directories($dir/include/src/)" # 路径为绝对路径,相对路径会报错. 此数组个数与 CMakeLists.txt 中的 include_directories 个数对应 file="CMakeLists.txt" incNumber=`cat -n $file | grep -w include_directories | wc -l` # wc -l 计算个数 if [ "${#incList[*]}" != "$incNumber" ] then echo "$file 文件 include_directories 定义个数 ${#incList[*]} 与 $incNumber 目标修改个数不相等,无法对应修改。" echo "请在 touchCMake 和 autoINCPath 函数, 增加或者 删除 include_directories 关键字个数,以达到与目标修改个数一致。然后重新执行脚本" exit else incI=0; #while : for((;;)) do incNumberList=(`cat -n $file | grep -w include_directories | grep -v okset| awk -F" " '{print $1}' `) Number=${#incNumberList[*]} NR=${incNumberList[0]} if [ "$Number" -lt "1" ] then echo "[ok] 当前绝对路径已经全部修正, 正在执行 CMakeLists.txt 自动化编译。 " break fi echo "[runing] 当前游标:$incI 当前修改行:$NR 当前剩余总修改次数: $Number 文件:$file 所有行:${incNumberList[*]} 目标内容:${incList[$incI]} " sed -i "$NR a ${incList[$incI]} # [eisc.cn_okset]" $file sed -i "$NR d " $file # 始终修改第一个元素,然后由于循环再去查找行号 # 错误方式,删除一行后,其他内容行号会变,因此每次删除,需要重新扫描行号 # [okset] 修改了的地方做标记 let "incI++" # 先获取 0 后,再自动增加。而不是 先增加: 0+1 第一次为 1 sleep 0.01 done fi } touchCMake ; autoINCPath rm -rf ./build ; cmake ./ -Bbuild ; cmake --build build ./build/$RunApp #----- cs.c -----##include <stdio.h> void main(){ int ib=12; int cishu=0; for(;;) { ib--; cishu++; if(ib<1) { printf("\n [ok] 循环结束,当前 ib 值: %d \n",ib); break; } else { printf("\n 循环运行次数: %d",cishu); } } printf("\n 我是 cs.c 程序 \n"); return 0; }
 0   0  454天前
admin
1114
#include<stdio.h> #define MAX #define MAXIMUM(x,y)(x>y)?x:y #define MINIMUM(x,y) (x>y)?y:x // 理解为: if ( x > y ) return y; else return x; // 符号() 判断 ; 问号 ? 条件成立(then) 返回y的值; 冒号 : 条件不成立(else) 返回x int main() { int a=10,b=20; #ifdef MAX printf("已经使用define 定义 MAX 宏 条件成立, 当前板块代码有效 %d\n",MAXIMUM(a,b)); #else printf("没有定义 MAX 当前板块代码无效 %d\n",MINIMUM(a,b)); #endif // endif 结束判断 宏 #ifndef MIN printf("ifndef 判断没有定义弘(多了一个n), 条件成立,该板块代码有效 MIN %d\n", MINIMUM(a,b)); #else printf("已经定义 MIN 宏, 该板块代码无效 %d\n",MAXIMUM(a,b)); #endif #undef MAX // 取消之前定义的 宏 #ifdef MAX printf("定义有效 %d\n",MAXIMUM(a,b)); #else // else 否则 printf("定义的 MAX 宏 被 undef 取消定义,当前等于没有定义 MAX 宏 %d\n",MINIMUM(a,b)); #endif return 0; }
 4   0  495天前
admin
1206
#include <stdio.h> #include <unistd.h> // sleep 函数包索引 int flag = 0; int flag1 =0; int cishu = 0; int jhcs = 3; // bool 是二进制类型; void test(int bit, int val) { // 由于 main 函数,我得到 数值: 1 1 printf("我是控制灯函数..."); // int const Mask = Bits1_GetMsk(bit); if (val){ printf("c 中的 if 默认条件:当前 val 的值不为空,或者不为0 条件成立 ; 我的值是:%d 等于接收都控制信号" , val); } else { printf("val 为 0 或者 为空, if 的默认条件就不成立"); } } void shanshuo(void) { if (flag == 0) { test(0,1); flag=1; // 因为需要实现 闪灯,一会关一会开,因此开启后关闭,实现闪烁 printf(" \n \n 【当前控制灯为 开】 \n 当前 flag 的值为 0 , 我执行函数 写入 1 开启灯 ; 函数控制硬件后,我将其 设置为1 进行变换 \n \n "); } else { test(0,0); flag=0; // 因为 flag 的值不为 0 ,因此将其赋值为 0 ,等于将 1 变换成 0 ,实现开关作用,闪烁 printf(" \n \n 【当前控制灯为 关】 \n 当前 flag 的值不为 0 , 我执行函数 写入 0 关闭灯 ; 函数控制硬件后,我将其 设置为0 进行变换 \n \n "); } } int main() { while(1) { printf("测试无限循环打印"); usleep(200000); cishu++; printf("当前 得到 次数 :%d \n" , cishu); shanshuo(); if (cishu > jhcs ) { printf("当前循环执行闪烁次数:%d 已经超过计划次数: %d 现在退出 闪烁功能 \n " , cishu, jhcs); break ; // 退出本函数,或者退出循环 } else { printf("当前已经执行次数: %d \n", cishu); } } printf("循环函数 停止运行了! "); } /* 1.转换说明符 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和double) %e(%E) 浮点数指数输出[e-(E-)记数法] %g(%G) 浮点数不显无意义的零"0" %i 有符号十进制整数(与%d相同) %u 无符号十进制整数 %o 八进制整数 e.g. 0123 %x(%X) 十六进制整数<?xml:namespace prefix = st1 />() e.g. 0x1234 %p 指针 %s 字符串 %% "%" 参考:https://blog.csdn.net/qq_29874741/article/details/94626531 0 0x0f 0xf0 0x08 --> 0000 1000 #define clrSetReg8Bits(RegName, ClrMask, SetMask) f0 08 (RegName = (RegName & ((byte)(~(byte)(ClrMask)))) | (byte)(SetMask)) 存储器: 当前是与非或计算: 由于前面函数传入:参数 0xf0 0x08u (~(byte)(ClrMask)) : f0 非运算: 原值为1 则非计算 为0 ; 再与 0 与计算 有0 为0 ; 再与 | (byte)(SetMask) 或计算 */
 4   0  549天前
admin
1246
#include <iostream> #include <assert.h> using namespace std; // c++ 类 访问控制和继承,能访问的类型: // 同一个类: public protected [prəˈtektɪd] 受保护 private [ˈpraɪvət] 私有 // 派生类:public protected // 外部类:public class A{ public: // 定义类 A 的公共函数 A 和 fun int a; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } void fun(){ cout << a << endl; //正确 cout << a1 << endl; //正确 cout << a2 << endl; //正确 cout << a3 << endl; //正确 } public: int a1; protected: int a2; private: int a3; }; class B : public A{ public: // 派生类 int a; B(int i){ A(); a = i; } void fun(){ cout << a << endl; //正确,public成员 cout << a1 << endl; //正确,基类的public成员,在派生类中仍是public成员。 cout << a2 << endl; //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。 // cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 } }; int main(){ B b(10); //外部类,只能访问 public cout << b.a << endl; cout << b.a1 << endl; //正确 // cout << b.a2 << endl; //错误,类外不能访问protected成员 // cout << b.a3 << endl; //错误,类外不能访问private成员 return 0; }
 4   0  566天前
admin
883
nano eisc.c                                # 编辑c文件#include <stdio.h> // 函数外定义变量 x 和 yint x;int y;int addtwonum(){    // 函数内声明变量 x 和 y 为外部变量    extern int x;    extern int y;    // 给外部变量(全局变量)x 和 y 赋值    x = 1;    y = 2;    return x+y;// 这个函数的最终结果返回  x+y 的值} int main(){    int result;    // 调用函数 addtwonum    result = addtwonum();        printf("result 为: %d",result);    return 0;}
 0   0  801天前
admin
115
#include<stdio.h> #include <time.h> void tione() { // 该程序要做的事情: // 1. ab和大于10,c=ab 否则 c=3a+2b // 2. a>b 则打印: 3(a+b) // 3. 排除 c大等于20 和 a>b 的情况,打印: 4c-5 // 4. a=a+b; b=a+b; c=a+b+c 打印各自的数字 int a=2,b=5,c; if(a+b>10){c=a*b; } else { c=3*a+2*b;} // ab和大于10,c=ab 否则 c=3a+2b if(c>=20){ printf("%d", c*c);} // c大等于20 打印C的平方 else if(a>b){ printf("%d", 3*(a+b));} // 遇到 a>b 则打印: 3(a+b) else{printf("%d",4*c-5);} // 排除 c大等于20 和 a>b 的情况,打印: 4c-5 printf("\n"); a=a+b; b=a+b; c=a+b+c; // abc 赋值 printf( "a=%d, b=%d, c=%d\n", a, b, c); // 打印 abc 的数值 // printf("\n 解密算法: a=2 b=5 a+b=7 小于10 而满足: c=3*2+2*5 = 16 "); // printf("\n c=16 小于20 且 a<b 因此 打印: 4*16-5=64-5=59 "); // printf("\n a=a+b=2+5=7 b=a+b=7+5=12 c=7+12+16=35 \n "); } void titwo() { // 定义 x 变量, switch 进行匹配 x-1 即第一次循环 5-1=4 // case 匹配中即打印,匹配到 11-1=10 即跳出循环 int x; for(x=5; x<12; x+=2) { printf("x=%d x+=2 => x=x+2 \n ",x); switch(x-1) { case 4:printf("%d\n", x); case 7:printf("%d\n",2*x+1); case 10:printf("%d\n", 3*x-1); break; default:printf("default\n"); } } } void tithree() { int s0,s1,s2,x; s0=s1=s2=0; printf("从键盘输入一组整数,以 -1 结束: \n"); scanf("%d",&x); while (x!=-1) { switch(x%3) // 判断 输入的 x 参数 除以 3 的余数是多少 { case 0:s0+=x;break; // s0+=x => s0=s0+x => s0++ 自增加步长为 x ; 通过循环自动增加数字; 满足余数0 才赋值 case 1:s1+=x;break; case 2:s2+=x;break; } scanf("%d",&x); } printf("s0=%d,s1=%d,s2=%d\n",s0,s1,s2); } int main() { // 函数指针数组 void (*functionArray[])() = {tione, titwo, tithree}; // 循环调用数组中的函数 for (int i = 0; i < 3; i++) { functionArray[i](); // 调用数组中的函数 } return 0; }
 0   0  25天前
admin
450
#!/bin/bash rundir=/datadisk/eisc/server/lib/libpcap/libpcap1104 sudo apt install -y gcc flex byacc make cmake wget https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz tar -xzvf libpcap-1.10.4.tar.gz cd libpcap-1.10.4 sudo mkdir -p $rundir sudo chmod 777 $rundir ./configure --prefix=$rundir make ; make install # /datadisk/eisc/server/lib/libpcap/libpcap1104/lib/libpcap.so # /datadisk/eisc/server/lib/libpcap/libpcap1104/include echo "库文件路径: $rundir/lib/libpcap.so"
 2   0  54天前
admin
380
#include <iostream> struct ListNode { // 链表通过节点实现,节点包含:数据和指向下一个节点的指针 int parameter; // 节点存储的数据 【属性1】 ListNode *next; // 链表桥接:链表类型被指针继承 【属性2】 ListNode(int x) : parameter(x), next(nullptr) {} // 声明构造函: 与结构体名称相同 ListNode(int x) 传入的参数 是 int 整形 // 初始化构造函数: 接收 x 参数来初始化本身 // 链表桥接:next(nullptr) 内置函数 nullptr 空0 表示没有后续节点,不需要桥接 }; // 函数用于反转链表 ListNode* reverseList(ListNode* head) { // ListNode* head 链表 接头点; 函数结构体:需要对结构体表 ListNode 进行操作的函数 ListNode *prev = nullptr; // prev 指针继承结构体:指向 结构体的指针 为空: 跟踪【反转】链表过程中的前一个节点 ListNode *current = head; // 指针继承结构体: 表的头节点,遍历链表 ListNode *next = nullptr; // 临时存储下一个节点 while (current != nullptr) { // 如果main() 函数传来的 head 不是空的,进入循环 next = current->next; // 本函数指针next = 原结构体 (current = ListNode) 中的 ListNode.next 成员 current->next = prev; // 原结构体表结尾 = 本函数 表接头 : 原结构体 ListNode.next 成员 = 本函数指针 prev ; 反转当前节点的指针 prev = current; // 移动prev指针: prev 获取数据 current = next; // 移动current指针 } // 当前头节点已经是链表的最后一个节点,反转后它将成为新的头节点 head = prev; return head; } // 辅助函数:打印链表 void printList(ListNode *node) { while (node != nullptr) { std::cout << node->parameter << " "; node = node->next; } std::cout << "nullptr" << std::endl; // 打印链表结束标记 } // 辅助函数:清理分配的内存 void cleanList(ListNode *&head) { ListNode *current = head; while (current != nullptr) { ListNode *temp = current; current = current->next; delete temp; } head = nullptr; } int main() { // 创建链表:1 -> 2 -> 3 -> nullptr ListNode *head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); // 打印原始链表 std::cout << "Original list: "; printList(head); // 反转链表 head = reverseList(head); // 打印反转后的链表 std::cout << "Reversed list: "; printList(head); // 清理分配的内存 cleanList(head); return 0; }
 0   1  112天前
admin
491
#---- TableTennis.h ----#typedef struct { int aCount; int aStatusFlag; int aWinFourgamesFlag; int aCompetentFlag; }aScoreStruct; extern aScoreStruct aScoreS; typedef struct { int bCount; int bStatusFlag; int bWinFourgamesFlag; int bCompetentFlag; }bScoreStruct; extern bScoreStruct bScoreS; #---- TableTennis.c ----##include <stdio.h> #include "TableTennis.h" aScoreStruct aScoreS; bScoreStruct bScoreS; // 结构体声明,引用,理解为: 结构体 被 bScoreS 继承 #define ScoreZero 0 // 定义常量变量,理解为 普通变量 后面是赋值 0 #define ScoreFour 4 #define ScoreTen 10 #define ScoreEleven 11 #define ScoreTwelve 12 static int VictoryExitFlag = 0; // static 静态变量 其数值 为0 不被更改,一般在函数内:被其他方法赋值后,在其他if 或者 for 等方法中 不希望保留数值,而是每次都是 0 进行使用 static int abTieFlag = 0; void Counting_Score(aScoreStruct *_aScoreS,bScoreStruct *_bScoreS,int inputData[2]) { // 结构体 赋值给 指针,main 函数调用本函数需要传递内存地址 if( inputData[0] == 1 ) { _aScoreS->aStatusFlag = 1; _aScoreS->aCount++; } else { _bScoreS->bStatusFlag = 1; _bScoreS->bCount++; } if(_aScoreS->aCount == ScoreFour && _bScoreS->bCount == ScoreZero) { VictoryExitFlag = 1; aScoreS.aWinFourgamesFlag = 1; printf("\n a 胜利,连胜 %d 局 \n",ScoreFour); } if(_aScoreS->aCount == ScoreZero && _bScoreS->bCount == ScoreFour) { VictoryExitFlag = 1; bScoreS.bWinFourgamesFlag = 1; printf("\n b 胜利,连胜 %d 局 \n",ScoreFour); } if( _bScoreS->bCount == ScoreTen && _aScoreS->aCount == _bScoreS->bCount ) { printf("\n a b 在 %d : %d 中平局,需要加局赛 \n",ScoreTen,ScoreTen ); abTieFlag = 1; } if( _aScoreS->aCount == ScoreTwelve && abTieFlag == 1) { VictoryExitFlag = 1; printf("\n a 胜利,得分: %d ; 来自: %d : %d 平局加局赛 \n",_aScoreS->aCount, ScoreTen,ScoreTen); } if( _bScoreS->bCount == ScoreTwelve && abTieFlag == 1) { VictoryExitFlag = 1; printf("\n b 胜利,得分: %d ; 来自: %d : %d 平局加局赛 \n",_bScoreS->bCount, ScoreTen,ScoreTen); } if( _aScoreS->aCount == ScoreEleven && abTieFlag == 0) { VictoryExitFlag = 1; printf("\n a 胜利,得分: %d ; 来自:先得 11 分\n",_aScoreS->aCount); } if( _bScoreS->bCount == ScoreEleven && abTieFlag == 0) { VictoryExitFlag = 1; printf("\n b 胜利,得分: %d ; 来自:先得 11 分\n",_bScoreS->bCount); } } int TableTennis(void) { for(;;) { int inputData[2]; if( VictoryExitFlag == 1 ) { printf("\n 统计结束 \n"); break; } printf("\n 输入 A 的分数,然后回车输入B的分数 \n"); for(int i=0;i<2;i++) { scanf("%d",&inputData[i]); } Counting_Score(&aScoreS,&bScoreS,inputData); printf("\n aScoreS.aCount = %d,aScoreS.aWinFourgamesFlag = %d,\n bScoreS.aCount = %d,bScoreS.bWinFourgamesFlag = %d",aScoreS.aCount,aScoreS.aWinFourgamesFlag,bScoreS.bCount,bScoreS.bWinFourgamesFlag); } } int main() { TableTennis(); } #####################  shell 脚本 方式 #################################!/bin/bash #----- 5 --------# # 乒乓球规则: # 在一局比赛中,先得11分的一方为胜方; # 10 比 10 平手后,先多得 2 分的一方为 胜方; # 一场比赛中,先赢 4 局 的人为整场比赛胜方; # 现在需要一个程序实现乒乓球比赛的记分表: # 1. 每次输入 0/1 代表该次赢球获胜方( 0/1 表示输入 0 或者 1 ) # 2. 足够长的比赛赢球输入后,当整场比赛的最终胜方出现时,返回该结果 Acont=0;Astatus=0;Aok=0; Aliansheng=0; Bcont=0;Bstatus=0;Bok=0; Bliansheng=0; PingJu=0; main(){ for((;;)) do # read -p "请输入本次的分数, a b 两位参赛者顺序输入 0 1: " tongji # tjList=( $tongji ) # if [ ${tjList[0]} = 1 ] # then # ((Acont++)) # ((Aliansheng++)) # else # ((Bcont++)) # ((Bliansheng++)) # if read -p "请输入本次的分数, a b 两位参赛者顺序输入 0 1: " tongji tjList=( $tongji ) ajia=${tjList[0]} if [ $ajia = 1 ] then ((Acont++)) ((Aliansheng++)) else ((Bcont++)) ((Bliansheng++)) fi if [[ $Aliansheng = 4 ]] && [[ $Bliansheng = 0 ]] then Aok=1; echo "A 胜利, 连胜 4 场" exit; else echo "" fi if [[ $Bliansheng = 4 ]] && [[ $Aliansheng = 0 ]] then Bok=1; echo "B 胜利, 连胜 4 场" exit else echo "" fi #---------------------------- 平局 与 正常加分 -------------------# if [ $Acont -eq 10 ] then if [ $Acont = $Bcont ] then PingJu=1; fi fi if [ $Bcont -eq 10 ] then if [ $Acont = $Bcont ] then PingJu=1; fi fi if [[ $Acont = 12 ]] && [[ $PingJu = 1 ]] then Aok=1 echo "A 胜利, 平局加局赛" exit fi if [[ $Bcont = 12 ]] && [[ $PingJu = 1 ]] then Bok=1; echo "B 胜利, 平局加局赛" exit fi #---- ok ---- if [ $PingJu = 0 ] then if [ $Acont = 11 ] then Aok=1; echo "A 胜利 先得分 11 分" exit fi if [ $Bcont = 11 ] then Bok=1; echo "B 胜利 先得分 11 分" # exit fi fi echo " Acont = $Acont; Bcont = $Bcont ; Aliansheng = $Aliansheng; Bliansheng = $Bliansheng; PingJu = $PingJu" done } main
 0   0  124天前
admin
673
uint8_t eisc66A[8], eisc666[8];memcpy(eisc66A,eisc666,8);// 将 eisc666 数组 赋值 给 eisc666  长度为 8 // 在赋值数组时候不用跟上数组长度,但是两个数组长度一致: 
 0   0  218天前
admin
829
//---- gpio.h ----// #include <stdint.h> // uint 函数 头文件 static uint8_t ddrsum[6] = { 7, 3, 7, 3, 7, 7 }; // const 只读,不允许改变的关键字数组类型 /* static uint64_t gpioNM[] = { 'DDRT', 'DDRM', 'DDRS', 'DDRJ', 'DDRP', 'DDR0AD' }; */ static uint64_t gpioNM[] = { 'T', 'M', 'S', 'J', 'P', 'D' }; // 参数结构体 typedef struct { uint64_t gpioname; uint8_t gpiosum; uint8_t _incAD; uint8_t i; }GPIOtruct; extern GPIOtruct gpio; //---- gpio.c ----// #include <stdio.h> // 标准头文件 #include <stdint.h> // uint_8 头文件 #include <string.h> #include "gpio.h" GPIOtruct gpio; uint64_t PgpioNM[6]; uint8_t Pddrsum[6]; uint8_t counti= sizeof(ddrsum)/sizeof(ddrsum[0]); // 数组总字节大小 除以 第一个字节大小 等于 多少个数组元素 void GetValue(void) // 从 .h 里面获取数组 { uint64_t *pRom, *pRam; uint8_t Cnt = 0; pRom = (uint64_t*)&gpioNM; pRam = (uint64_t*)&PgpioNM; Cnt = counti; while(Cnt--) { *pRam++ = *pRom++; } pRom = (uint8_t*)&ddrsum; pRam = (uint8_t*)&Pddrsum; Cnt = counti; while(Cnt--) { *pRam++ = *pRom++; } } void jisuan(GPIOtruct *_gpio) { _gpio->gpiosum = Pddrsum[_gpio->i]; // 获取个数 _gpio->gpioname = PgpioNM[_gpio->i ]; // 获取名字 uint8_t i = _gpio->gpiosum; // char *p; // p=_gpio->gpioname; // 强制转换变量类型 //strcpy(p, _gpio->gpioname); char *p; p=_gpio->gpioname; for (;;) { if( 0 > i || 255 == i ) { break; } printf( "DDR%s_DDR%s%d=0; \n" ,&p, &p, i ); // 打印: 是指针的内存地址,对应的值 i--; } } int main(int argc, char const *argv[]) { uint8_t i=0; GetValue(); for(;;) { usleep(200000); // 200ms gpio.i=i; if(counti-1<i) // count=6 时 循环7次; 6-1=5 循环6次 { printf("exit! i = %d counti = %d \n \n ",i, counti); break; } else { printf("\n"); } jisuan(&gpio); i++; } return 0; }
 2   0  239天前
admin
919
在C语言中,当你要传递一个变量的地址而不是变量的值时,你需要使用&操作符。这通常用于传递指针或引用类型的参数。 以下情况下需要使用&操作符: 1. 指针类型: 定义 void foo(int* ptr) 调用 int num = 10; foo(&num); 2. 修改函数外部的变量 void modify(int* ptr){ *ptr = 20; } 调用:int num = 10; modify(&num); 最终将 ptr修改为 10 3. 输入 scanf 函数 int num; scanf("%d", &num); 传递的是基本类型的变量或者数组时,不需要使用&操作符,因为它们会被自动传递为值。例如,`void foo(int num)`,你可以直接传递变量的值来调用它,例如`int num = 10; foo(num);`。 需要注意的是,使用&操作符传递变量的地址时,需要确保接收参数的函数能够处理指针类型的参数。
 4   0  347天前
admin
948
如果要存储超长的文本数据,可以考虑使用动态内存分配来存储文本。在C语言中,可以使用malloc函数来动态分配内存空间,并使用char类型的指针来存储文本数据。 下面是一个示例代码,展示了如何使用动态内存分配来存储超长的文本数据: #include <stdio.h> #include <stdlib.h> int main() { // 假设文本数据长度为10000 int length = 10000; // 动态分配内存空间 char* text = (char*)malloc(length * sizeof(char)); // 检查内存分配是否成功 if (text == NULL) { printf("Failed to allocate memory\n"); return 1; } // 读取文本数据到动态分配的内存空间中 // 这里使用fgets函数从文件中读取文本数据 FILE* file = fopen("text.txt", "r"); if (file == NULL) { printf("Failed to open file\n"); free(text); // 释放动态分配的内存空间 return 1; } fgets(text, length, file); // 关闭文件 fclose(file); // 打印文本数据 printf("%s\n", text); // 释放动态分配的内存空间 free(text); return 0; } 上述代码中,我们首先使用malloc函数动态分配了一个长度为length的字符数组,并将返回的指针赋值给text。然后,我们使用fgets函数从文件中读取文本数据并存储到动态分配的内存空间中。最后,我们使用printf函数打印出文本数据。
 4   0  349天前
admin
969
在C语言中,可以使用printf函数来打印不同类型的数值。下面是一些常见的数据类型及其对应的printf格式说明符: 整数类型: int %d short %hd long %ld long long %lld 无符号整数类型: unsigned int %u unsigned short %hu unsigned long %lu unsigned long long %llu 字符类型: char %c 浮点数类型: float %f double %lf 指针类型: void* %p 以下是示例代码,展示如何使用printf打印不同类型的数值: #include <stdio.h> int main() { int num1 = 10; float num2 = 3.14; char ch = 'A'; char str[] = "Hello"; printf("Integer: %d\n", num1); printf("Float: %f\n", num2); printf("Character: %c\n", ch); printf("String: %s\n", str); return 0; } 在上述示例中,我们定义了一个整数变量num1,一个浮点数变量num2,一个字符变量ch,以及一个字符串数组str。 然后,我们使用printf函数打印了这些变量的值,分别使用了对应的格式说明符。执行上述代码后,将会打印出相应的数值。
 4   0  349天前
admin
952
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <netinet/udp.h> #include <netinet/ip_icmp.h> #define BUFFER_SIZE 4096 void process_packet(unsigned char *buffer, int size) { struct iphdr *ip_header = (struct iphdr *)(buffer); unsigned short ip_header_length = ip_header->ihl * 4; struct tcphdr *tcp_header = (struct tcphdr *)(buffer + ip_header_length); unsigned short tcp_header_length = tcp_header->doff * 4; unsigned char *payload = buffer + ip_header_length + tcp_header_length; int payload_length = size - ip_header_length - tcp_header_length; // 在这里处理报文内容,可以打印报文信息或对报文进行其他操作 printf("Received packet with size: %d\n", size); } int main() { int raw_socket; unsigned char buffer[BUFFER_SIZE]; struct sockaddr_in server_address; int data_size; // 创建原始套接字 raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); if (raw_socket < 0) { perror("Failed to create socket"); return 1; } // 绑定地址 server_address.sin_family = AF_INET; server_address.sin_port = 0; server_address.sin_addr.s_addr = INADDR_ANY; if (bind(raw_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) { perror("Failed to bind"); return 1; } // 开始监听 while (1) { data_size = recvfrom(raw_socket, buffer, BUFFER_SIZE, 0, NULL, NULL); if (data_size < 0) { perror("Failed to receive"); return 1; } process_packet(buffer, data_size); } return 0; }
 4   0  351天前
快速发帖 高级模式
guest
登录之后更精彩~
我的小伙伴
Powered by HadSky 7.12.10
© 2015-2024 PuYueTian
小绿叶技术博客