c语言

【C语言】字符逆序

萝らか妹 提交于 2020-02-26 02:42:39
字符逆序 题目描述 将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 输入 输入包括一行。 第一行输入的字符串。 输出 输出转换好的逆序字符串。 # include <stdio.h> # include <string.h> int main ( ) { char a [ 100 ] , b [ 100 ] ; gets ( a ) ; int i = 0 ; do { b [ i ] = a [ i ] ; i ++ ; } while ( a [ i ] != NULL ) ; for ( int j = i - 1 ; j >= 0 ; j -- ) { printf ( "%c" , b [ j ] ) ; } } 来源: CSDN 作者: weixin_46014378 链接: https://blog.csdn.net/weixin_46014378/article/details/104448908

C++编译过的C代码为什么要用extern C

。_饼干妹妹 提交于 2020-02-25 23:35:35
首先extern关键字: extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。相反,static关键字则是只能在本模块中使用。 通常,在模块的 头文件 中对本模块 提供给其它模块引用的函数和全局变量 以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 extern "C": extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的, extern "C"必须出现在函数的第一次声明上。 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int

extern \"C\" 用法解析

老子叫甜甜 提交于 2020-02-25 23:34:19
extern "c"用法解析 作者 作者Jason Ding ,链接 http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。 extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名。 揭秘extern "C" 从标准头文件说起 #ifndef __INCvxWorksh /*防止该头文件被重复引用*/ #define __INCvxWorksh #ifdef __cplusplus //__cplusplus是cpp中自定义的一个宏 extern "C" { //告诉编译器



extern C

喜你入骨 提交于 2020-02-25 23:33:58
extern "C"包含双重含义,其一:被它修饰的目标是“extern”的;其二:被它修饰的目标是“C”的。 1)被extern “C”限定的函数或变量是extern类型的; extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其他模块中使用。 注意:extern int a; 仅仅是在声明一个变量,并不是定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 通常,在模块的头文件中对模块提供给其他模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只 需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错,它会在连接阶段中从模块A编译生 成的目标代码中找到此函数。 与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern "C"修饰。 2)被extern "C"修饰的变量和函数是按照C语言方式编译和连接的 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为

如何编写自己的C语言头文件

落爺英雄遲暮 提交于 2020-02-25 23:28:15
一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#include语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处。为了避免因为重复引用而导致的编译错误,头文件常具有: #ifndef _DELAY_H_ #define _DELAY_H_ //代码部分 #endif 的格式。 其中,DELAY为一个唯一的标号,命名规则跟变量的命名规则一样。常根据它所在的头文件名来命名,例如,如果头文件的文件名叫做stc15w.h,那么可以这样使用: #ifndef _STC15W_H_ #define _STC15W_H_ //代码部分 #endif 这样写的意思就是,如果没有定义__STC15W_H__,则定义__STC15W_H__,并编译下面的代码部分,直到遇到#endif。这样,当重复引用时,由于__STC15W_H__已经被定义,则下面的代码部分就不会被编译了,这样就避免了重复定义。另外,使用#include时,使用引号“”与尖括号<>的意思是不一样的。使用引号“”时

C语言字符串去掉指定字符

孤街浪徒 提交于 2020-02-25 20:18:32
一、去掉字符串指定字符 1 #include <stdio.h> 2 #include <string.h> 3 4 void del_char(char a[],char c) 5 { 6 int i,j; 7 for(i=0,j=0; *(a+i)!='\0'; i++) 8 { 9 if(*(a+i)==c) 10 continue; 11 else 12 { 13 *(a+j)=*(a+i); 14 j++; 15 } 16 } 17 *(a+j)='\0'; 18 } 19 int main() 20 { 21 char a[100],c; 22 scanf("%s %c",a,&c); 23 del_char(a,c); 24 printf("%s",a); 25 return 0; 26 } 运行结果: 注: 如果想去掉字符串最后一个字符,简便方法是:str[strlen( str ) - 1] = '\0'; 来源: https://www.cnblogs.com/yinguojin/p/12363330.html

循环队列(c语言)

限于喜欢 提交于 2020-02-25 18:16:58
  在循环队列中,Q->front==Q->rear 并不能确定队列为空,也有可能是队列已满,所以采用“队列头指针在队列尾指针的下一位置”来判断队列已满(此方法会浪费一个内存空间)。 《数据结构(C语言版)[严蔚敏_吴伟民]》中63页有讲解。   此程序,在书中例子的基础上,增加了内存空间不足的重新分配。 define.h 1 // define.h 2 #ifndef __MENGQL_DEFINE__ 3 #define __MENGQL_DEFINE__ 4 5 #define C_LOG_DBG(format, ...) 6 //printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); 7 #define C_LOG_ERR(format, ...) printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); 8 typedef enum EStatus {ERROR, OK} Status; 9 10 #endif SqQueue.h 1 // SqQueue.h 2 #ifndef __SQ_QUEUE_H__ 3 #define __SQ_QUEUE_H__ 4 5

C语言要点总结-关键字总结

别来无恙 提交于 2020-02-25 16:11:57
目录 6关键字总结: 6.1define(宏定义) 6.2const(恒定) 6.3 sizeof 6.4static(静态) 6.4.1static修饰局部变量 6.4.2static修饰全局变量 6.4.3static修饰函数 6.4.4在C++等面对对象编程语言中 6.5 auto(自动变量) 6.6 4个与储存类型相关的关键字总结 6.6.1.auto 6.6.2.extern 6.6.3.register 6.6.4. static 6.7 typedef 6关键字总结: 32个关键字 数据类型 关键字(12个) char,short,int,long,float,double, unsigned,signed,struct(结构体),union(共用体),enum(枚举),void 控制语句 关键字(12个) if,else,switch,case,default,for,do,while,break,continue,goto,return 存储类 关键字(5个) auto(自动变量),extern(外部类型变量),register (寄存器类型变量) , static(静态类型变量 ) , const 其他 关键字(3个) sizeof , typedef ,volatile 6.1define(宏定义) #define NUM 100 预处理部分

C语言求n的阶乘(n!)

梦想的初衷 提交于 2020-02-25 08:11:01
从键盘输入一个数,求出这个数的阶乘,即 n!。 算法思想 首先要清楚阶乘定义,所谓 n 的阶乘,就是从 1 开始乘以比前一个数大 1 的数,一直乘到 n,用公式表示就是:1×2×3×4×…×(n-2)×(n-1)×n=n! 具体的操作:利用循环解决问题,设循环变量为 i,初值为 1,i 从 1 变化到 n;依次让 i 与 sum 相乘,并将乘积赋给 sum。 ① 定义变量 sum,并赋初值 1。 ② i 自增 1。 ③ 直到 i 超过 n。 程序代码 #include <stdio.h> int main () { int i ,n ; double sum = 1 ; scanf ( "%d" ,&n ); for (i = 1 ;i <=n ;i ++) sum =sum *i ; printf ( "%d!=%lf" ,n ,sum ); printf ( " \n " ); return 0 ; } 调试运行结果 输入 5,对应的阶乘输出情况如下所示; 5 5!=120.000000 输入20,对应的阶乘输出情况如下所示: 20 20!=2432902008176640000.000000 总结 ① 由于阶乘一般较大,会超出整型甚至是长整型所能表示的范围,因此定义变量时就不能定义为整型,而应该考虑双精度数。 ② 实训中定义了一个双精度型的变量,用来存放结果

C语言——malloc()函数

邮差的信 提交于 2020-02-25 00:45:19
动态存储的函数的原型为: void * malloc ( unsigned int size ) ; 函数的作用: 系统自动在内存的动态存储区中,分配长度为size的一段连续空间。 若此函数执行成功,则函数返回值为指向被分配域的起始地址的指针(该函数的返回值的基本类型为void)。 若该函数执行失败(如内存空间不足的情况),则函数返回值为空指针(NULL)。 举例: # include <stdio.h> # include <stdlib.h> main ( ) { int * a, * b, * c ; a = b = c = ( int * ) malloc ( sizeof ( int ) ) ; * a = 1 ; * b = 2 , * c = 3 ; a = b printf ( "%d, %d, %d\n" , * a , * b , * c ) ; } malloc()函数动态分配了一个整型的内存空间,然后把函数返回的地址用(int*)强制类型转换为整型指针,再把它赋给a, b, c, 即让指针变量a, b, c 都指向刚申请的内存空间。所以只有最后一个赋值语句*c=3的值保留在了该空间内,因为a, b, c三个指针变量均指向该空间,所以最后打印出都是3。 来源: CSDN 作者: chr0610 链接: https://blog.csdn.net/chr0610