-
2021-05-18 15:16:40
c语言中strcmp的用法的用法你知道吗?下面小编就跟你们详细介绍下c语言中strcmp的用法的用法,希望对你们有用。
c语言中strcmp的用法的用法如下:
头文件:#include
strcmp() 用来比较字符串(区分大小写),其原型为:
int strcmp(const char *s1, const char *s2);
【参数】s1, s2 为需要比较的两个字符串。
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。
【返回值】若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。
注意:strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符;如果考虑到本地化的需求,请使用 strcoll() 函数。
【实例】对 4 组字符串进行比较。
01.#include
02.main(){
03. char *a = "aBcDeF";
04. char *b = "AbCdEf";
05. char *c = "aacdef";
06. char *d = "aBcDeF";
07. printf("strcmp(a, b) : %d\n", strcmp(a, b));
08. printf("strcmp(a, c) : %d\n", strcmp(a, c));
09. printf("strcmp(a, d) : %d\n", strcmp(a, d));
10.}
输出结果:
strcmp(a, b) : 32
strcmp(a, c) :-31
strcmp(a, d) : 0
更多相关内容 -
用C语言实现类实例化的研究
2020-10-16 16:24:16多年以来,C语言在嵌入式软件开发中被广泛使用,但由于开发人员和应用场景等原因,面向对象、设计模式等优秀的软件开发方法始终没有很好地运用起来。...文章结合C语言的特性,对使用C语言实现类实例化进行了讨论。 -
C语言中的回调函数实例
2020-12-31 09:01:37在C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: 代码如下:char *pa,pb;//pa是一个char型指针,但pb是一个... -
c语言结构体的实例使用
2021-03-03 14:40:37六、实例 需求:我们串口发送是一个字节一个字节的,我们制定的协议如下: 一阵协议10个字节,放于buff[10] byte0 byte1 0x5555起始 byte2 value1 byte3 byte4 value2 byte5 byte6 byte7 byte8 value3 byte9 0xff ...一、结构体介绍
结构体是自定义的一种类型,可以让程序结构更清晰二、结构体定义
struct tag { member-list member-list member-list ... } variable-list ;
1、方式1,定义结构体并声明
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
2、方式2,分开定义和声明
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } ; struct Books book;
3、方式3,使用typedef
typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book_def; book_def book;
其中Books可以省略,如下
typedef struct { char title[50]; char author[50]; char subject[100]; int book_id; } book_def; book_def book;
三、结构体的访问
book.id = 100; printf("%d",book.id); strcpy(book.title,"C Programming"); printf("%s",book.title);
四、结构体数组
1、定义typedef struct { char title[50]; char author[50]; char subject[100]; int book_id; } book_def; book_def book[10];
2、访问
book[0].id = 100; printf("%d",book[0].id); strcpy(book[1].title,"C Programming"); printf("%s",book[1].title);
3、直接传递
book[2] = book[1];
五、结构体指针
1、定义typedef struct { char title[50]; char author[50]; char subject[100]; int book_id; } book_def; book_def *pbook; book_def book;
2、操作
pbook = &book; (*pbook).id = 10; pbook->id = 20; strcpy((*book).title,"C Programming"); strcpy(book->title,"C Programming");
六、实例
需求:我们串口发送是一个字节一个字节的,我们制定的协议如下:
一阵协议10个字节,放于buff[10]
byte0 byte1 0x5555起始
byte2 value1
byte3 byte4 value2
byte5 byte6 byte7 byte8 value3
byte9 0xff 停止常规方法解析:
char value1; short value2; int value3; value1 = buff[2]; value2 = (buff[3] << 8) + buff[4] ; value3 = (buff[5] << 24) + (buff[6] << 16) + (buff[7] << 8)+buff[8]; printf("%d",value1); printf("%d",value2); printf("%d",value3);
结构体方法解析:
typedef struct { short start; char value1; short value2; int value3; char stop; } value_def; value_def *pvalue; pvalue = (pvalue *)buff;//强制转换地址类型再给地址到指针 printf("%d",pvalue->value1); printf("%d",pvalue->value2); printf("%d",pvalue->value3);
-
C ++对象实例化
2021-05-23 10:56:45许多教程使用片段演示对象实例化,例如:Dog* sparky = new Dog();这暗示你以后会这样做:delete sparky;这是有道理的。 现在,在不需要动态内存分配的情况下,是否有任何理由使用上述代替Dog sparky;一旦sparky...C ++对象实例化
我是一名试图理解C ++的C程序员。 许多教程使用片段演示对象实例化,例如:
Dog* sparky = new Dog();
这暗示你以后会这样做:
delete sparky;
这是有道理的。 现在,在不需要动态内存分配的情况下,是否有任何理由使用上述代替
Dog sparky;
一旦sparky超出范围,让析构函数被调用?
谢谢!
el_champo asked 2019-07-11T04:20:45Z
9个解决方案
160 votes
相反,您应该总是更喜欢堆栈分配,在一定程度上,您的用户代码中永远不应该有新的/删除。
正如您所说,当变量在堆栈上声明时,它的析构函数会在超出范围时自动调用,这是跟踪资源生命周期和避免泄漏的主要工具。
因此,通常,每次需要分配资源时,无论是内存(通过调用new),文件句柄,套接字还是其他任何东西,都将它包装在构造函数获取资源的类中,析构函数将其释放。 然后,您可以在堆栈上创建该类型的对象,并确保在资源超出范围时释放资源。 这样您就不必在任何地方跟踪新的/删除对,以确保避免内存泄漏。
这个成语最常见的名字是RAII
还要研究智能指针类,它们用于在极少数情况下包装结果指针,当您必须在专用RAII对象外部分配新内容时。 您将指针传递给智能指针,然后智能指针跟踪其生命周期,例如通过引用计数,并在最后一个引用超出范围时调用析构函数。 标准库具有std::unique_ptr用于简单的基于范围的管理,而std::shared_ptr用于引用计数以实现共享所有权。
许多教程演示了对象 使用诸如...之类的片段进行实例化
所以你发现的是大多数教程很糟糕。;)大多数教程都教你糟糕的C ++实践,包括调用new / delete来在不需要的时候创建变量,并让你很难跟踪你的分配生命周期。
jalf answered 2019-07-11T04:21:49Z
21 votes
虽然堆栈上的东西在分配和自动释放方面可能是一个优势,但它有一些缺点。
您可能不希望在堆栈上分配大型对象。
动态调度! 考虑以下代码:
#include
class A {
public:
virtual void f();
virtual ~A() {}
};
class B : public A {
public:
virtual void f();
};
void A::f() {cout << "A";}
void B::f() {cout << "B";}
int main(void) {
A *a = new B();
a->f();
delete a;
return 0;
}
这将打印“B”。 现在让我们看看使用Stack时会发生什么:
int main(void) {
A a = B();
a.f();
return 0;
}
这将打印“A”,对于熟悉Java或其他面向对象语言的人来说可能不太直观。 原因是您没有指向a实例的指针。 而是创建A的实例并将其复制到A*类型的变量A&。
有些事情可能会不直观地发生,特别是当你不熟悉C ++时。 在C中你有你的指针就是这样。 你知道如何使用它们,它们总是一样。 在C ++中,情况并非如此。 想象一下,当你在这个例子中使用a作为方法的参数时会发生什么 - 如果a类型为A或者A*或者甚至是A&(通过引用调用),事情会变得更加复杂。 许多组合都是可能的,它们的行为都不同。
UniversE answered 2019-07-11T04:23:00Z
13 votes
好吧,使用指针的原因与在使用malloc分配的C中使用指针的原因完全相同:如果你希望你的对象比你的变量活得更久!
如果可以避免使用新操作员,甚至强烈建议不要使用它。 特别是如果你使用例外。 通常,让编译器释放对象会更安全。
PierreBdR answered 2019-07-11T04:23:34Z
13 votes
我已经看到了这种反模式来自那些并不完全得到&amp; 运营商地址。 如果他们需要使用指针调用函数,他们将始终在堆上进行分配,以便获得指针。
void FeedTheDog(Dog* hungryDog);
Dog* badDog = new Dog;
FeedTheDog(badDog);
delete badDog;
Dog goodDog;
FeedTheDog(&goodDog);
Mark Ransom answered 2019-07-11T04:24:02Z
7 votes
将堆视为一个非常重要的房地产,并非常明智地使用它。 基本的拇指规则是尽可能使用堆栈,并在没有其他方法时使用堆。 通过在堆栈上分配对象,您可以获得许多好处,例如:
(1)。 如果出现异常,您无需担心堆栈展开
(2)。 您不必担心由堆管理器分配的空间超出所需的内存碎片。
Naveen answered 2019-07-11T04:24:44Z
5 votes
我担心的唯一原因是Dog现在被分配在堆栈上,而不是堆。 因此,如果Dog的大小为兆字节,则可能会出现问题,
如果确实需要使用新的/删除路由,请注意例外情况。 因此,您应该使用auto_ptr或其中一种boost智能指针类型来管理对象的生命周期。
Roddy answered 2019-07-11T04:25:18Z
1 votes
当你可以在堆栈上分配时,没有理由新(在堆上)(除非由于某种原因你有一个小堆栈并想要使用堆。
如果您想在堆上分配,可能需要考虑使用标准库中的shared_ptr(或其变体之一)。 一旦对shared_ptr的所有引用都已经存在,那将为您执行删除操作。
Scott Langham answered 2019-07-11T04:26:00Z
0 votes
还有一个原因,没有其他人提到过,为什么你可以选择动态创建对象。 动态的,基于堆的对象允许您使用多态。
dangerousdave answered 2019-07-11T04:26:29Z
-4 votes
我在Visual Studio中遇到了同样的问题。 你必须使用:
yourClass-&GT;类方法();
而不是:
yourClass.classMethod();
Hamed answered 2019-07-11T04:27:10Z
-
C语言函数实例
2021-04-12 07:58:44指函数名后括号中的变量,因形参只有在函数被调用的过程中才会实例化(分配内存单元),即形式参数。形参当函数调用完成之后就会自动销毁,也就是说形参只在函数中有效。 形参实例化之后其实相当于实参的一份临时...函数
实参:
真实传给函数的参数,可以是常量,变量,表达式,函数等。在进行函数调用时,它们必须有确定的值,以便把这些值传送给形参。
形参:
指函数名后括号中的变量,因形参只有在函数被调用的过程中才会实例化(分配内存单元),即形式参数。形参当函数调用完成之后就会自动销毁,也就是说形参只在函数中有效。
形参实例化之后其实相当于实参的一份临时拷贝。函数调用:
传值调用:函数形参与实参分别占用不同内存块,对形参的修改不会影响实参。
传址调用:把函数外部创建变量的内存地址传递给函数参数的一种调用函数方式。函数组成:
ret_type fun_name(para1,para2)//返回类型,函数名,函数参数
{
statement//函数体,语句项
}函数独立性:
#include <stdio.h>
int Add(int x,int y)//定义一个加法函数
{
int z=0;
z=x+y;
return z;
}
int main()
{
int a=10;
int b=20;
int sum=Add(a,b);//调用函数
printf("%d\n",sum);
return 0;
}库函数:
#include <stdio.h>
#include <string.h>
int main()
{
char arry1[]=“amy”;
char arry2[]=“111111111”;
strcpy(arry2,arry1);//字符串拷贝(库函数),需要头文件<string.h>
printf("%s\n",arry2);//输出函数,需要头文件<stdio.h>
return 0;
}两者取较大函数:
#include <stdio.h>
int get_max(int x,int y)//定义比较函数
{
if(x>y)
return x;
else
return y;}
int main()
{
int a=10;
int b=20;
int max=get_max(a,b);//函数使用
printf(“max=%d\n”,max);
}交换整形变量函数:
#include <stdio.h>
int main()
{
int a=10;
int b=20;
int tmp=0;
printf(“a=%d,b=%d\n”,a,b);
tmp=a;
a=b;
b=tmp;
printf(“a=%d,b=%d\n”,a,b);
return 0;
}
错误:
正确:
注意:Void 表示为空,无返回值
练习:
1.判断101-200之间有多少个素数,并输出所有素数。
分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
#include <stdio.h>int is_prime(int n)//是素数返回1,否则返回0
{
int j;
for(j=2;j<n;j++)
{
if(n%j==0)
return 0;
}
return 1;
}
int main()
{
int i,sum=0;
for(i=100;i<200;i++)//打印100-200之间的素数
{
if(is_prime(i)==1)//判断i是否为素数
{
printf("%5d\n",i);
sum+=1;
}
}
printf(“总计%d个素数”,sum);
}
2.判断1000-2000之间有多少个闰年,并输出所有闰年。
分析:判断闰年的方法,用该数除以4的余数为0且除以100不为0或除以400等于0即为闰年。
#include <stdio.h>
int is_leap_year(int y)//是闰年返回1,否则返回0
{
if(y%40 && y%100!=0||y%4000)
return 1;
}
int main()
{
int i,sum=0;
for(i=1000;i<=2000;i++)//打印1000-2000之间的闰年
{
if(is_leap_year(i)==1)//判断i是否为闰年
{
printf("%5d\n",i);
sum+=1;
}
}
printf(“总计%d个闰年”,sum);
return 0;
}
3.写一个函数,实现一个整形有序数组的二分查找。
#include <stdio.h>
int binary_search(int arr[],int k,int sz)
{
//算法实现
int left=0;
int right=sz-1;
while(left<=right)
{
int mid=(left+right)/2;//中间元素下标
if(arr[mid]<k)
{
left=mid+1;
}
else if(arr[mid]<k)
{
right=mid-1;
}
else
{
return mid;
}
}
return 0;
}
int main()
{
/二分查找,在一个有序数组里查找一个具体的数
若找到则返回这个数的下标,找不到返回-1/
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k=7;
int sz=sizeof(arr)/sizeof(arr[0]);
int ret=binary_search(arr,k,sz);
if(ret==-1)
{
printf(“找不到指定的数字\n”);
}
else
{
printf(“找到喽,其下标是%d\n”,ret);
}
return 0;
}
4.写一个函数,每调用一次这个函数,就将num的值加1。
#include <stdio.h>
void Add(int* p)
{
(*p)++;
}
int main()
{
int num=0;
Add(&num);
printf(“num=%d\n”,num);
Add(&num);
printf(“num=%d\n”,num);
Add(&num);
printf(“num=%d\n”,num);
return 0;
}
函数嵌套调用:
#include <stdio.h>
void new_one()
{
printf(“世界真好!!!\n”);
}
void new_two()
{
int i=0;
for(i=0;i<5;i++)
{
new_one();
}
}
int main()
{
new_two();
return 0;
}
链式访问:
把一个函数的返回值作为另外一个函数的参数。
#include <stdio.h>
#include <string.h>
int main()
{
int len=0;
//1
len=strlen(“abc”);
printf("%d\n",len);
//2
printf("%d\n",strlen(“abc”));
return 0;
}
指针:
指针变量:存放变量地址,如 pa=&a;
变量类型:type*,如int* pa=&a;//指针变量pa的类型为整形
*pa=a;//解引用操作,即变量 -
c语言中static关键字用法详解
2018-04-05 18:18:14static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。 但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏... -
c语言中map的用法:map基本用法
2021-05-18 10:35:41c++中map容器提供一个键值对...c语言中map的用法:map基本用法 1. 头文件复制代码 代码如下:#include 2. 定义复制代码 代码如下:map my_map; //注意这里的int和int可以是其他类型或者是复制代码 代码如下:typedef... -
C语言泛型编程实例教程
2021-01-01 14:28:43本文实例讲述了C语言泛型编程的方法,分享给大家供大家参考之用。具体分析如下: 首先,泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。在C语言中,可以通过一些手段... -
MongoDB的C语言编程实例
2021-05-25 07:29:45下面讲述在Linux平台下MongoDB的C语言编程实例假设已经安装好了MongoDB。1. 下载MongoDB的C语言驱动并安装这里下载的MongoDB的C语言驱动是 mongo-c-driver-1.3.5.tar.gz。解压后打开mongo-c-driver-1.3.5目录下... -
C语言中struct初始化
2020-10-16 16:15:57标签:des class style log com ...使用 ...C语言中struct初始化 • 普通结构体的初始化 &n... -
C语言中exit函数的使用
2021-05-18 17:05:14exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时.如果有时要检测... -
C语言if语句实例
2020-11-23 23:14:31// 初始化 int price = 0; int bill = 0; // 读入金额和票面 printf("请输入金额:"); scanf("%d",&price); printf("请输入票面:"); scanf("%d",&bill); // 计算找零 if (bill >= price) -
c语言中的scanf函数应用实例
2020-04-01 20:19:49c语言中的scanf函数! scanf函数的头文件 scanf函数与printf函数一样,scanf函数都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h> #include<stdio.h> scanf(""); scanf函数的... -
简单的c语言编程实例
2021-05-25 07:31:10广告精选中小企业最主流配置,适用于web应用场景、小程序及简单移动App,所有机型免费分配公网IP和50G高性能云硬盘(系统盘)。 -
float在c语言中怎么用
2021-05-21 06:57:15C语言中printf输出float和double都用%f么(scanf又 1.C语言中printf输出float和double都可以用%f,而double型数据还可以用%lf。 2.scanf当中若是对双精度的变量赋值是必须是%后跟lf,而printf当中可以用%f也可以用%lf... -
C语言sqrt函数的实例用法讲解
2021-05-22 17:57:27前言继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。一、继承规则继承是C++中的重要特性,派生2021-03-22 18:02:41大家有没有... -
C语言中system函数用法解释
2020-09-15 09:58:35//清屏,等于在DOS上使用cls命令 ================================================================ 下面列出常用的DOS命令,都可以用system函数调用: ASSOC 显示或修改文件扩展名关联。 AT 计划在计算机上运行的... -
C语言const用法详解(带实例)
2021-03-27 21:40:06在C语言中const常用来定义常量,表示这个常量是不可以被修改的。define宏定义也可以用来表示一个常量。那么他们有那些区别呢! 1、预编译指令只是对值进行简单的替换,不能进行类型检查 2、可以保护被修饰的东西... -
C语言中结构体变量私有化详解
2021-05-20 13:22:22C语言中结构体变量私有化详解背景介绍操作系统 : CentOS7.3.1611_x64gcc版本 :4.8.5什么是结构体?在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以... -
c语言中point的用法_C/C++中 *和&的爱恨情仇
2020-11-21 08:37:59C++中&和*的用法一直是非常让人头疼的难点,课本博客上讲这些的知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外...的用法C++语言是C语言的超集。几乎所有可以运行的C程序都是可... -
C语言实例说明
2021-05-19 11:28:32原标题:C语言实例说明上一节,我们大致总揽了一个简单C程序的框架,程序如下:123456789#include /*引入头文件*/int main( void ) /*一个简单的C程序*/{int number; /*定义个名字叫做number的变量*/number=2014; /*... -
C语言switch使用之诡异用法详解
2021-05-21 04:09:23关于switch的用法这里不再做什么总结了,其实这个是一个便捷的快速跳转条件切换器。而关于这个功能最常用的技术讨论点在于case后面的break以及default。这里不讨论这些,直接看下面的代码:#include"stdio.h"int ... -
C语言初始化——栈的初始化
2021-05-19 02:40:43此过程涉及为该实例上的每个存储属性设置初始值,并执行在新实例准备好使用之前所需的任何其他设置或初始化. 您可以通过定义实现这个初始化过程初始化,这就像特 ... C语言顺序栈实现 /*数序栈*/ #include #include #... -
C语言中const的用法
2022-04-13 20:23:22本文介绍了const的基本用法,单独使用const的说明,const与指针的结合使用,以及const与#define的区别,并附上实例帮助读者理解 -
C语言 strftime 格式化显示日期时间的实现
2021-05-19 15:19:31C语言 strftime 格式化显示日期时间的实现C/C++程序中需要程序显示当前时间,可以使用标准函数strftime。函数原型:size_t strftime (char* ptr, size_t maxsize, const char* format,const struct tm* timeptr );... -
c语言循环语句(c语言循环语句实例)
2021-05-23 07:29:49不需要有例子,只需要用法就可以C语言循环语句用法有三种主要形式:1. for()循环2. while()循环3. do {} while();循环 for()循环用法:for( e1 ; e2 ; e3 ) //注意三个区域间用分号来分隔,而不.goto语句百(不常用)... -
C语言中的符号总结
2021-05-21 15:55:19概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ... 浅谈C语言中的强符号、弱符号、强引用和弱引用 摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱... -
C语言中联合体union的实例详解
2021-03-10 04:36:08C语言中联合体union的实例详解C语言中联合体union的实例详解1.定义:union(int i, short s, char c) un;un.i = 3;printf(“i=%d”,un.i);printf(“length = %d\n”,sizeof(un);//==4,有最大的变量来决定2.相当与... -
C++中类的实例化的方法
2020-03-26 12:49:12C++中类的实例化的方法 类的实例化按照在分配内存上面的不同大体分为在:栈中的分配内存和堆中的内存的分配,于是分为下面三种方式。 class CEmployee { private: int age; int id; public: CEmployee() { cout <...