用指针和自定义函数求2字符串差值

鹿鹿´_>` 2019-11-28 09:50:59
#include <stdio.h> #include<stdlib.h> int stringCompared(char *p1,char *p2) {int i; i=0; while(*(p1+i)==*(p2+i)) if (*(p1+i++)=='\0') return(0); return(*(p1+i)-*(p2+i)); } int main() { int m; char str1[20],str2[20]; char *p1,*p2; scanf("%s %s",str1,str2); p1=str1; p2=str2; m=stringCompared(str1,str2); printf("%d",m); return 0; } 自定义函数部分啥意思???
...全文
85 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2019-11-29
  • 打赏
  • 举报
回复
你的问题就是这个自定义函数要表达的。类似strcmp,比较两个字符串的大小(一个字符以字符的比较)
mymtom 2019-11-29
  • 打赏
  • 举报
回复
严格来说,楼主帖子里的实现是有缺陷的,因为标准里的的字符比较要按照unsigned char来进行
4.11.4 Comparison functions

The sign of a nonzero value returned by the comparison functions is
determined by the sign of the difference between the values of the
first pair of characters (both interpreted as unsigned char ) that
differ in the objects being compared.

这个代码才符合标准,注意里面的 unsigned char

int
strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2++)
if (*s1++ == '\0')
return (0);
return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
}
mymtom 2019-11-29
  • 打赏
  • 举报
回复
4.11.4.2 The strcmp function

Synopsis

#include <string.h>
int strcmp(const char *s1, const char *s2);

Description

The strcmp function compares the string pointed to by s1 to the
string pointed to by s2 .

Returns

The strcmp function returns an integer greater than, equal to, or
less than zero
, according as the string pointed to by s1 is greater
than, equal to, or less than the string pointed to by s2 .
mymtom 2019-11-29
  • 打赏
  • 举报
回复
4.11.4.2 The strcmp function

Synopsis

#include <string.h>
int strcmp(const char *s1, const char *s2);

Description

The strcmp function compares the string pointed to by s1 to the
string pointed to by s2 .

Returns

The strcmp function returns an integer
greater than, equal to, or
less than zero
, according as the string pointed to by s1 is greater
than, equal to, or less than the string pointed to by s2 .
pengbolan 2019-11-28
  • 打赏
  • 举报
回复
字符串比较!!!
《明解C语言 第3版 入门篇》是日本的C语言经典教材,自出版以来不断重印、修订,被誉为“C语言圣经”。 《明解C语言 第3版 入门篇》图文并茂,示例丰富,第3版从190段代码和164幅图表增加到205段代码和220幅图表,对C语言的基础知识进行了彻底剖析,内容涉及数组、函数、指针、文件操作等。对于C语言语法以及一些难以理解的概念,均以精心绘制的示意图,清晰、通俗地进行讲解。原著在日本广受欢迎,始终位于网上书店C语言著作排行榜首位。 第1章 初识C语言 1 1-1 显示计算结果 2 计算整数的和并显示结果 2 程序和编译 2 注释 3 固定代码 4 printf函数:格式化输出函数 4 语句 5 计算并显示整数的差 5 格式化字符串和转换说明 6 符号的称呼 8 无格式化输出 8 字符串常量 10 转义字符 10 1-2 变量 11 变量和声明 11 赋值 12 初始化 13 声明时初始化 14 初始化和赋值 14 1-3 输入和显示 16 通过键盘进行输入 16 格式化输入函数scanf 16 乘法运算 17 输出函数puts 18 总结 21 第2章 运算和数据类型 23 2-1 运算 24 运算符和操作数 24 乘除运算符和加减运算符 25 除法运算的商和余数 25 使用printf函数打印% 26 获取整数的最后一位数字 26 多个转换说明 27 单目运算符 28 赋值运算符 29 表达式和赋值表达式 30 表达式语句 30 2-2 数据类型 31 平均值 31 数据类型 32 数据类型和对象 33 整型常量和浮点型常量 34 double类型的运算 34 数据类型和运算 35 类型转换 37 转换说明 39 总结 42 第3章 分支结构程序 45 3-1 if语句 46 if语句·其1 46 奇数的判定 47 if语句·其2 48 奇数·偶数的判断 49 非0的判断 49 if语句的结构图 50 相等运算符 52 余数的判断 53 关系运算符 54 嵌套的if语句 55 判断 57 计算较大值 58 计算三个数的最大值 59 条件运算符 60 差值计算 61 复合语句(程序块) 62 逻辑运算符 65 短路值 67 3-2 switch语句 70 switch语句和break语句 70 复杂的switch语句 72 switch语句和if语句 73 选择语句 74 总结 75 第4章 程序的循环控制 77 4-1 do语句 78 do语句 78 复合语句(程序块)中的声明 79 读取一定范围内的值 80 逻辑非运算符·德摩根定律 81 德摩根定律 81 多个整数的和及平均值 82 复合赋值运算符 84 后置递增运算符和后置递减运算符 85 4-2 while语句 87 while语句 87 用递减运算符简化程序代码 88 数据递增 90 限定次数的循环操作 91 字符常量和putchar函数 92 do语句和while语句 93 前置递增运算符和前置递减运算符 93 do语句的显示 95 逆向显示整数值 96 4-3 for语句 99 for语句 99 使用for语句实现固定次数的循环 101 偶数的枚举 103 约数的枚举 104 表达式语句和空语句 104 循环语句 105 4-4 多重循环 107 二重循环 107 用break语句强制结束循环 108 显示图形 109 多重循环 111 4-5 程序的组成元素和格式 114 关键字 114 运算符 114 标识符 114 分隔符 115 常量和字符串常量 115 自由的书写格式 116 连接相邻的字符串常量 117 缩进 117 总结 118 第5章 数组 121 5-1 数组 122 数组 122 数组的声明(使用数组前的准备) 123 访问数组(数组的使用方法) 123 数组的遍历 124 数组初始化 126 数组的复制 127 输入数组元素的值 129 对数组的元素进行倒序排列 129 使用数组进行成绩处理 131 对象式宏 131 数组元素的最大值和最小值 133 赋值表达式的判断 134 数组的元素个数 135 5-2 多维数组 138 多维数组 138 总结 142 第6章 函数 145 6-1 什么是函数 146 main函数和库函数 146 什么是函数 146 函数定义 147 函数调用 148 三个数中的最大值 151 将函数的返回值作为参数传递给函数 152 调用其他函数 154 值传递 155 6-2 函数设计 158 没有返回值的函数 158 通用性 159 不含形参的函数 160 函数返回值的初始化 161 作用域 161 文件作用域 162 声明和定义 163 函数原型声明 163 头文件和文件包含指令 164 函数的通用性 165 数组的传递 166 函数的传递和const类型的修饰符 168 线性查找(顺序查找) 170 哨兵查找法 172 多维数组的传递 175 6-3 作用域和存储期 178 作用域和标识符的可见性 178 存储期 180 总结 185 第7章 基本数据类型 189 7-1 基本数据类型和数 190 算数类型和基本数据类型 190 基数 191 基数转换 192 7-2 整型和字符型 195 整型和字符型 195 头文件 196 字符型 199 位和CHAR_BIT 200 sizeof运算符 200 size_t型和typedef声明 202 整型的灵活运用 202 整型的内部表示 204 无符号整数的内部表示 205 有符号整数的内部表示 207 按位操作的逻辑运算 209 位移运算符 212 整型常量 216 整型常量的数据类型 218 整数的显示 218 数据溢出和异常 220 7-3 浮点型 221 浮点型 221 浮点型常量 223 头文件 224 循环的控制 225 7-4 运算和运算符 228 运算符的优先级和结合性 228 优先级 228 结合性 228 数据类型转换 230 总结 232 第8章 动手编写各种程序吧 235 8-1 函数式宏 236 函数和数据类型 236 函数式宏 237 函数和函数式宏 238 不带参数的函数式宏 239 函数式宏和逗号运算符 240 8-2 排序 243 冒泡排序法 243 8-3 枚举类型 246 枚举类型 246 枚举常量 248 命名空间 250 8-4 递归函数 251 函数和类型 251 阶乘 252 8-5 输入输出和字符 255 getchar函数和EOF 255 从输入复制到输出 256 数字字符计数 256 字符 258 转义字符 261 总结 263 第9章 字符串的基本知识 265 9-1 什么是字符串 266 字符串字面量 266 字符串字面量的长度 266 字符串 268 字符数组的初始化赋值 269 空字符串 270 字符串的读取 270 格式化显示字符串 271 9-2 字符串数组 273 字符串数组 273 读取字符串数组中的字符串 274 9-3 字符串处理 275 字符串长度 275 显示字符串 277 数字字符的出现次数 278 大小写字符转换 279 字符串数组的参数传递 280 总结 283 第10章 指针 285 10-1 指针 286 函数的参数 286 对象和地址 287 取址运算符 288 指针 289 指针运算符 291 10-2 指针和函数 293 作为函数参数的指针 293 计算和与差 294 二值互换 296 将两个值排序 297 scanf函数和指针 298 指针的类型 299 空指针 300 标量型 301 10-3 指针和数组 302 指针和数组 302 指针运算符和下标运算符 304 数组和指针的不同点 306 数组的传递 308 总结 311 第11章 字符串指针 315 11-1 字符串指针 316 用数组实现的字符串和用指针实现的字符串 316 用数组实现的字符串和用指针实现的字符串的不同点 318 字符串数组 320 11-2 通过指针操作字符串 323 判断字符串长度 323 字符串的复制 325 不正确的字符串复制 328 返回指针的函数 329 11-3 字符串处理库函数 330 strlen函数:字符串的长度 330 strcpy函数、strncpy函数:复制字符串 331 strcat函数、strncat函数:连接字符串 332 strcmp函数、strncmp函数:比较字符串的大小关系 332 atoi函数、atol函数、atof函数:转换字符串 333 总结 336 第12章 结构体 339 12-1 结构体 340 数据关联性 340 结构体 342 结构体成员和运算符 344 成员的初始化 345 结构体成员和->运算符 346 结构体和typedef 348 结构体和程序 350 聚合类型 351 返回结构体的函数 351 命名空间 353 结构体数组 353 派生类型 355 12-2 作为成员的结构体 356 表示坐标的结构体 356 具有结构体成员的结构体 357 总结 361 第13章 文件处理 363 13-1 文件与流 364 文件与流 364 标准流 365 FILE型 365 打开文件 365 关闭文件 368 打开与关闭文件示例 369 文件数据汇总 370 写入日期和时间 372 获取上一次运行时的信息 376 显示文件内容 378 文件的复制 380 13-2 文本和二进制 382 在文本文件中保存实数 382 文本文件和二进制文件 383 在二进制文件中保存实数 384 显示文件自身 386 13-3 printf函数与scanf函数 389 printf函数:带格式输出 389 scanf函数:带格式的输入 393 总结 397 附录 C语言简介 399 C语言的历史 400 K&R——C语言的圣经 400 C语言标准规范 400 结语 402 参考文献 405
用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: a) int a; // An integer b) int *a; // A pointer to an integer c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int *a[10]; // An array of 10 pointers to integers f) int (*a)[10]; // A pointer to an array of 10 integers g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 13.下面的数据声明都代表什么? (1)float (**def)[10]; def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float. (2)double*(*gh)[10]; gh是一个指针,它指向一个一维数组,数组元素都是double*. (3)double(*f[10])(); f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数. (4)int *((*b)[10]); 就跟int *(*b)[10]是一样的,b是一维数组的指针. (5)Long (*fun)(int); 函数指针. (6)int (*(*F)(int,int))(int); F是一个函数指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函数,返回的函数指针指向有一个int参数且返回int的函数.  所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。   转义字符 意义 ASCII码值(十进制)   \a 响铃(BEL) 007   \b 退格(BS) 008   \f 换页(FF) 012   \n 换行(LF) 010   \r 回车(CR) 013   \t 水平制表(HT) 009   \v 垂直制表(VT) 011   \\ 反斜杠 092   \? 问号字符 063   \' 单引号字符 039   \" 双引号字符 034   \0 空字符(NULL) 000   \ddd 任意字符 三位八进制   \xhh 任意字符 二位十六进制   字符型常量   字符型常量所表示的值是字符型变量所能包含的值。我们可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。   'A', '\x2f', '\013';   其中:\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。   注意:在Turbo C 2.0中,字符型常量表示数的范围是-128到127,除非你把它声明为unsigned,这样就是0到255。   上面我们见到的\x,\n,\a等等都是叫转义字符,它告诉编译器需要用特殊的方式进行处理。下面给出所有的转义字符和所对应的意义:   转义字符 描述   \' 单引号   \ 双引号   \\ 反斜杠   \0 空字符   \ccc (最多三位)八进制数   \a 声音符   \b 退格符   \f 换页符   \n 换行符   \r 回车符   \t 水平制表符   \v 垂直制表符   \xhh(最多两位)十六进制符 下面的代码输出是什么,为什么? 1、sizeof()和strlen()的使用? 答: 1.从功能定义上,strlen函数,用来字符串的长度,sizeof函数是用来指定变量或变量类型等所占用内存的 大小; 2.sizeof是运算符,而strlen是C库函数strlen只能用char*做参数,且以'\0'结尾的; 对于静态数组处理: char str[20]="0123456789"; strlen(str)=10; //表示数组中字符串的长度 sizeof(str)=20; //表示数组变量分配的长度 对于指针处理: char *str="0123456789"; strlen(str)=10; //表示字符串的长度 sizeof(str)=4; //表示指针变量的所占内存大小 sizeof(*str)=1; //表示'0'这个字符变量的所占内存大小 2、 struct 和 class的区别? 答: (1)类中的成员默认是private的,当是可以声明为public,private 和protected,结构中定义的成员默认的都是public. (2)结构中不允许定义成员函数,当是类中可以定义成员函数. (3)结构不可以存在继承关系,当是类可以存在继承关系. 3、 strcpy(), strcat(), strcmp,strlen(), strchr(), memcpy(), memcmp(), memset()的编写? 4、 内存的分配方式的分配方式有几种? 答: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 5,、解释堆和栈的区别? 答: (1)栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 (2)堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.(主要有:malloc/free,new/delete) 6,、枚举的用法,以及它与宏的区别? 答: 枚举(enum)作用:定义一组常量,而且这些常量组成了一个集合。当我们将emun参数传递给函数时,如果传递了一个不属于这个集合的参数,编译器报错。 区别: 枚举是类型,而宏没有类型。 枚举将检查其语法,而宏是简单的文本替换。 7、 const的用法,以及声明const变量与宏的区别? 答: const的用法有四种: a): const对象和const类型的对象; b): const指针 和 指向const的指针 及两者结合; c): const 参数修饰 和 参数返回类型的const修饰; d): const类成员 和 const 成员函数; 区别: const常量有数据类型, 而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符 替换,没有类型 安全检查。而且字符替换可能会带来料想不到的边界效应。有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。 8、函数assert的用法? 答:断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。 9、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)? 答: #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 10、 写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个? 答: #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 11、嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 答: 这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 13、关于内存对齐的问题以及sizof()的输出? 答: 编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 14、 static有什么用途?(请至少说明两种) 答: (1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 (2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 (3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 15、引用与指针有什么区别? 答: (1) 引用必须被初始化,指针不必。 (2) 引用初始化以后不能被改变,指针可以改变所指的对象。 (3) 不存在指向空值的引用,但是存在指向空值的指针。 16、什么是平衡二叉树? 答: 左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。 17、堆栈溢出一般是由什么原因导致的? 答: 没有回收垃圾资源。 18、什么是预编译?何时需要预编译? 答: (1)总是使用不经常改动的大型代码体。 (2)程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 19、队列和栈有什么区别? 答: 队列先进先出;栈后进先出。 20、数组和链表的区别? 答: 数组:数据顺序存储,固定大小; 链表:数据可以随机存储,大小可动态改变; 21、为什么数组名作为参数,会改变数组的内容,而其它类型如int却不会改变变量的值? 答: 当数组名作为参数时,传递的实际上是地址。而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。 22、数据结构和算法: A:查找: (1)二分法查找; B:写出下列算法的时间复杂度和实现排序: (1)冒泡排序; (2)选择排序; (3)插入排序; (4)快速排序; (5)堆排序; (6)归并排序; 23、编写gbk_strlen函数,计算含有汉字的字符串的长度,汉字作为一个字符处理;已知:汉字编码为双字节,其中 参数里涉及指针,就要考虑该指针是不是一个需要修改的量,如果是,则参数应采用指向指针指针。 (C语言里参数传递都是传值,是一个拷贝,修改指针,只是改变了拷贝的指向,原指针指向并没有改变,而修改指针的内容则是可以的。)如果函数的参数是一个指针,不要指望用该指针去申请动态内存。(即上面所说的修改该指针) 编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,指针参数也不例外。 如果非得要用指针参数去申请内存,那么应该改用“指向指针指针”,由于“指向指针指针”这个概念不容易理解,我们也可以用函数返回值来传递动态内存。 常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡。 c语言里,利用函数的返回值来表明它是否执行成功的做法最常见。 2.如果要在单链表中删除或插入一个元素,就必须知道指向删除点或插入点前面那个元素的指针才行。 数组具有随机存取性(可以立即存取任一元素) char *str = "the word" 常量字符串,静态存储区,具有程序生命期。 char *str = (char *)malloc(....); 堆上分配,手动释放,否则内存泄漏。 char str[] = "the word" 栈上分配,函数生命期。 4. '\0'不是指ASCII码值,它是字符,它的ASCII码值是0,也就是ASCII码表的第一个字符。'\0'并非是空格,空格的ASCII码值是32,只不过是输出类似于空格而已。 5. 在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长,指针本身占据了4个字节的长度,即用一个字的空间保存一个地址。地址是按字节表示的,一个字节一个地址。地址+1,移动一个字节。 6.从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。 *p的结果是p所指向的东西 &a的运算结果是一个指针,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。 7. 声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个指针,该指针的类型是TYPE*,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区. 在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。 sizeof(array+n)测出的是指针类型的大小。 char类型的长度是一个字节,int类型的长度是4个字节,即一个字。 sizeof()得到的值是以字节为单位,所以sizeof(int) = 4 8. char* 相当于string ,char* arr[10]即字符串数组

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧