char函数

volatile

断了今生、忘了曾经 提交于 2020-02-29 16:33:22
很多人对Volatile都不太了解,其实Volatile是由于编译器优化所造成的一个Bug而引入的关键字。 int a = 10; int b = a; int c = a; 理论上来讲每次使用a的时候都应该从a的地址来读取变量值,但是这存在一个效率问题,就是每次使用a都要去内存中取变量值,然后再通过系统总线传到CPU处理,这样开销会很大。所以那些编译器优化者故作聪明,把a读进CPU的cache里,像上面的代码,假如a在赋值期间没有被改变,就直接从CPU的cache里取a的副本来进行赋值。但是bug也显而易见,当a在赋给b之后,可能a已经被另一个线程改变而重新写回了内存,但这个线程并不知道,依旧按照原来的计划从CPU的cache里读a的副本进来赋值给c,结果不幸发生了。 于是编译器的开发者为了补救这一bug,提供了一个Volatile让开发人员为他们的过失埋单,或者说提供给开发人员了一个选择效率的权利。当变量加上了Volatile时,编译器就老老实实的每次都从内存中读取这个变量值,否则就还按照优化的方案从cache里读。 volatile的本意是一般有两种说法--1.“暂态的”;2.“易变的”。 这两种说法都有可行。但是究竟volatile是什么意思,现举例说明(以Keil-c与a51为例 例子来自Keil FQA),看完例子后你应该明白volatile的意思了,如果还不明白

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

落爺英雄遲暮 提交于 2020-02-29 15:11:33
1、Unix shell的功能 shell是一个管理进程和运行程序的程序。所有常用的shell都有3个主要功能: (1)运行程序; (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言。 2、Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码。运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行。在Unix术语中,一个可执行程序是一些机器指令机器数据的序列。一个进程是程序运行时的内存空间和设置。数据和程序存储在磁盘文件中,程序在进程中运行。 每个进程都有一个可以唯一标识它的数字,被称为进程ID,一般简称PID;同时也有一个父进程ID(PPID)。每个进程都与一个终端相连,都一个已运行的时间,有优先级,有niceness级别,有大小。。。 Unix系统中的内存分为系统空间和用户空间。进程存在于用户空间。 3、如何执行一个程序 shell打印提示符,用户输入指令,shell就运行这个命令,然后shell再次打印提示符——如此反复。 一个shell的主循环执行下面的4步: (1)用户键入a.out (2)shell建立一个新的进程来运行这个出现 (3)shell将程序从磁盘载入 (4)程序在它的进程中运行知道结束 即: while (!end_of_input) get

源码阅读笔记:webbench-1.5

我们两清 提交于 2020-02-29 08:19:49
WebBench是个比较简单的程序,只有两个源文件:webbench.c, socket.c。 对源码重新排版一下,方便阅读: /* * (C) Radim Kolar 1997-2004 * This is free software, see GNU Public License version 2 for * details. * * Simple forking WWW Server benchmark: * * Usage: * webbench --help * * Return codes: * 0 - sucess * 1 - benchmark failed (server is not on-line) * 2 - bad param * 3 - internal error, fork failed * */ #include "socket.c" #include <unistd.h> #include <sys/param.h> #include <rpc/types.h> #include <getopt.h> #include <strings.h> #include <time.h> #include <signal.h> /* * 超时标记,当被设置为 1 时,所有子进程退出 * volatile: * - 让系统总是从内存读取数据, * -

C++字符类型总结区别wchar_t,char,WCHAR

℡╲_俬逩灬. 提交于 2020-02-29 07:48:40
转至:http://www.360doc.com/content/12/0807/01/9290626_228750141.shtml 1.区别wchar_t,char,WCHAR   ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。   UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里:   typedef unsigned short wchar_t;   另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t   wchar_t 可用字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如: wchar_t *szTest=L"This is a Unicode string."; 2.TCHAR   在C语言里面提供了 _UNICODE宏(有下划线),在Windows里面提供了UNICODE宏(无下划线),只要定了_UNICODE宏和UNICODE宏,系统就会自 动切换到UNICODE版本,否则,系统按照ANSI的方式进行编译和运行。只定义了宏并不能实现自动的转换,他还需要一系列的字符定义支持。 1. TCHAR

【leetcode】【medium】79. Word Search

戏子无情 提交于 2020-02-28 18:51:05
79. Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once. Example: board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] Given word = " ABCCED ", return true . Given word = " SEE ", return true . Given word = " ABCB ", return false . 题目链接: https://leetcode-cn.com/problems/word-search/ 思路 这道题很简单,但是写出来的代码一直在运行时间上表现不好。 第一版代码是这样的: class Solution { public: vector

一个AT命令处理小函数

孤街醉人 提交于 2020-02-28 18:43:32
问题描述 对于AT命令的回复,是一个字符串,如果处理该字符串,每次收到字符串都处理一次非常的麻烦,写一个函数来处理AT命令,能大大减少这种麻烦。 函数 /* * 取两个分隔符之间的子串 * str 原始字符串 * separator1 第一个分隔符 * separator2 第二个分隔符 * num 字符串出现几次时,作为第一个分隔符的位置。 * substr 取出的两个分隔符间的子串,从0起数。"+QMTRECV: 0,0,"Hello",hello world" */ uint8_t get_sub_str(char * str,char * separator1,char * separator2,int8_t num, char * substr) { int8_t i; char *p1,*p2; p1 = str; for(i = 0; i<=num; i++) { p1 = strstr(p1,separator1); if(p1 == NULL) return 1; p1++; } p2 = strstr(p1,separator2); if(p2 == NULL) return 2; memcpy(substr,p1,p2-p1); return 0; } 将AT命令返回的字符串赋给str,取两个分隔符之间的子串,将该子串放到substr中返回

BP算法

时光总嘲笑我的痴心妄想 提交于 2020-02-28 17:40:56
# define _CRT_SECURE_NO_WARNINGS # include "string.h" # include "stdio.h" /*BP算法的实现 *@auther:ck */ /*函数声明*/ int Index ( char * Buffer , char * buffer , int pos , int Count ) ; int Strlen ( char * Buffer ) ; /*main*/ void main ( void ) { int index ; int count ; char Buffer [ 20 ] = "acfgyhgtuoitmn" ; char buffer [ 6 ] = "tuoit" ; count = Strlen ( buffer ) ; index = Index ( Buffer , buffer , 2 , count ) ; for ( int i = 0 ; i < count ; i ++ ) { printf ( "%c" , Buffer [ index ++ ] ) ; } printf ( "\n" ) ; system ( "pause" ) ; } /* *@param:pos:need found position *@return:if found return position

Linux系统中软件简单License的实现

旧时模样 提交于 2020-02-28 15:48:56
概述 目前,很多商用应用系统是运行在Linux系统之上的,为了维护开发者利益,有必要为软件添加license功能,防止软件被盗用和挪用。本文探讨如何在Linux软件中添加license功能,用到的算法是MD5算法。 关键字: MD5 一 目的和思路 设置License就是要将软件和运行该软件的机器进行简单“绑定”,该软件只能在某台指定机器上使用,如果将该软件挪动到其他机器上则无法运行。 根据以上目的,那么思路就很清晰,则我们需要读取该指定机器的某些特征,这里我们只抓取两个特征,即CPU特征和机器MAC地址。 这样,我们需要一个获得机器特征的程序,一个生成license的程序以及在所要加license的程序中嵌入检查license的代码。生成license程序可以是在windows操作系统下编写,也可以在Linux系统下编写,本文只讨论后面一种。 二 关键技术 这里的三个关键技术是获得本机的CPU信息、获得网卡MAC地址信息以及MD5加密。 1. 获得CPU信息 兼容x86的CPU的信息存储在数据结构: struct cpuinfo_x86 { __u8 x86; /* CPU family */ __u8 x86_vendor; /* CPU vendor */ __u8 x86_model; __u8 x86_mask; char wp_works_ok; /* It doesn

linux c 字符串查找函数 strstr strcasestr

无人久伴 提交于 2020-02-28 10:29:17
一、strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include <string.h> [3] 函数功能 搜索"子串"在"指定字符串"中第一次出现的位置 [4] 参数说明 haystack -->被查找的目标字符串"父串" needle -->要查找的字符串对象"子串" 注:若needle为NULL, 则返回"父串" [5] 返回值 (1) 成功找到,返回在"父串"中第一次出现的位置的 char *指针 (2) 若未找到,也即不存在这样的子串,返回: "NULL" [6] 程序举例 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char *res = strstr("xxxhost: www.baidu.com", "host"); if(res == NULL) printf("res1 is NULL!\n"); else printf("%s\n", res); // print:-->'host: www.baidu.com' res = strstr("xxxhost: www.baidu.com", "cookie"); if(res ==

如何摆脱GCC中从字符串常量到&apos;char *&apos;&apos;警告的弃用转换?

假如想象 提交于 2020-02-28 06:53:03
所以我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了这个警告: 警告:不推荐将字符串常量转换为'char *' 显然,解决这个问题的正确方法是找到每个声明 char *s = "constant string"; 或函数调用如: void foo(char *s); foo("constant string"); 并使它们成为 const char 指针。 但是,这意味着触及564个文件,最小,这不是我希望在此时执行的任务。 现在的问题是我正在运行 -werror ,所以我需要一些方法来扼杀这些警告。 我怎样才能做到这一点? #1楼 PyTypeObject PyDict_Type= { ... PyTypeObject PyDict_Type= { PyObject_HEAD_INIT(&PyType_Type), "dict", dict_print, 0, 0 }; 观看名称字段,在gcc中编译时没有警告,但在g ++中它会,我不知道为什么。 在 gcc (Compiling C) ,-Wno-write-strings默认是活动的。 in g++ (Compiling C++) Wwrite-strings默认是活动的 这就是为什么会有不同的行为。 对于我们来说,使用 Boost_python 宏 Boost_python 产生这样的警告。