第3关:字符串比较 100 学习内容 参考答案 记录 评论 任务描述 相关知识 指向数组元素的指针 引用数组元素时指针的运算 引用数组元素 字符指针作函数参数 编程要求 测试说明 任务描述 本关任务:编写一个函数,实现两个字符串的比较。 相关知识 指针和数组虽然是不同的东西,但有着千丝万缕的联系。本关我们就来学习和数组有关的指针。 指向数组元素的指针 一个指针变量既可以指向变量,也可以指向数组元素(即把某一个元素的地址放到一个指针变量中)。 例如: int a[5] = {1,3,5,7,9}; int *p; p = &a[0]; 以上是使指针变量 p 指向 a 数组的第0个元素。 引用数组元素时指针的运算 当指针指向数组元素时,可以对指针进行加和减运算。 如上例子 p 指向数组元素 a[0] , p+1 则表示指向下一个数组元素 a[1] 。 在指针指向数组元素时,可以对指针进行以下运算: 加一个整数,如p+1 减一个整数,如p-1 自加运算,如p++,++p 自减运算,如p--,--p 两个指针相减,如p1-p2(只有当 p1 和 p2 都指向同一个数组中的元素才有意义) 注意:如果指针变量 p 指向数组中的一个元素,则 p+1 指向同一数组中的下一个元素, p-1 指向同一数组中的上一个元素。 引用数组元素 引用一个数组元素,可以有两种方法: 下标法:如 a[i] 的形式。 指针法:如*(a+i)或*(p+i),其中 a 是数组名, p 是指向数组元素的指针变量,其初值为 p = a 。 说明:因为 p+i 是指向 p 所指元素后第 i 个元素的指针,所以在其前加上指针运算符后得到的*(p+i)就是该元素的别名。因此,如果 p 指向 a[0],那么表达式*(p+i)就表示 a[i] 本身。 字符指针作函数参数 如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作为参数。 也可以用字符指针变量作为参数,在被调用的函数中可以改变字符串的内容,在主调函数(现在有 A、B 两个函数,A 函数调用了 B 函数,那么,A 函数就是主调函数,B 函数就是被调函数)中可以引用改变后的字符串。 编程要求 在右侧编辑器中的Begin-End之间补充代码,以实现字符串比较的功能。具体要求如下: 函数原型为:int stringCompared(char * p1,char * p2);,设p1指向字符串 s1,p2指向字符串 s2 ; 当 s1 == s2 时,返回值为0; 当 s1 != s2 时,返回他们两者第一个不同的字符的 ASCII 码差值。即如果 s1 > s2 ,则输出一个正值,如果 s1 < s2 ,则输出一个负值。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:asd123 asd123 预期输出:0 测试输入:123456 12356789 预期输出:-1#include <stdio.h> /********** Begin **********/ //在此编写函数,实现字符串比较 /********** End **********/ … printf("%d",m); return 0; }
时间: 2025-07-14 17:29:52 浏览: 15
<think>根据任务描述,我们需要实现一个字符串比较函数,函数原型为:`intstringCompared(char*p1,char*p2)`要求:-当两个字符串相等时,返回0。-当两个字符串不等时,返回第一个不同字符的ASCII码差值(如果第一个字符串的字符ASCII值大于第二个,则返回正值,否则返回负值)。实现思路:我们可以使用指针遍历两个字符串,逐个比较对应位置的字符:1.当两个指针都没有指向字符串结束符('\0')时,循环比较。2.如果当前字符不相等,则返回这两个字符的差值(*p1-*p2)。3.如果循环结束(即至少有一个字符串已经到结尾),那么检查两个字符串是否同时结束(即*p1和*p2都是'\0'),如果是,则返回0;否则,返回当前字符的差值(因为一个字符串已结束,另一个还有字符,此时比较当前字符,结束符的ASCII值为0,所以差值就是另一个字符的ASCII值减去0,或者0减去另一个字符的ASCII值)。注意:根据引用[3]中的示例代码,我们可以参考其实现方式,即:while(*s1&&(*s1==*s2)){s1++;s2++;}return*(unsignedchar*)s1-*(unsignedchar*)s2;但是题目要求函数名为`stringCompared`,并且参数为`char*`,我们可以采用类似方法。然而,引用[3]中使用了`unsignedchar*`的转换,这是为了避免有符号字符的比较出现负数时被符号扩展导致错误。但题目要求返回的是ASCII码差值,ASCII码都是非负的(0~127),所以也可以不用转换。但为了严谨(因为C语言中`char`可能是带符号的,而有些系统可能使用扩展ASCII码(128~255)),我们可以按照引用[3]的做法,使用`unsignedchar`来确保减法操作得到正确的差值。因此,我们可以在返回时进行类型转换。但是,根据任务描述,我们不需要使用`strcpy`,也不要使用标准库的`strcmp`,而是自己实现。我们按照以下步骤:1.使用循环,当两个字符相等且都不为0时,继续比较下一个字符。2.一旦遇到不相等的字符或者某个字符串结束,就跳出循环。3.返回两个指针当前指向字符的差值(转换为`unsignedchar`类型,然后相减)。具体代码实现:注意:题目要求函数名为`stringCompared`,参数为两个`char*`指针。因此,我们可以这样写:```cintstringCompared(char*p1,char*p2){while(*p1&&*p1==*p2){p1++;p2++;}return(*(unsignedchar*)p1)-(*(unsignedchar*)p2);}```但是,还有一种情况:当两个字符串长度不同,但前面的字符都相同时,循环会因为遇到其中一个字符串的结束符而退出,然后返回两个结束符的差值(其中一个为0,另一个为非0字符,或者两个都是0)。如果两个字符串同时结束,那么返回0,符合要求。如果其中一个先结束,那么比较到此处时,不相等,返回差值,正好是未结束字符串的当前字符(非0)减去0,即正值;或者结束字符串的0减去未结束字符串的当前字符,即负值。所以符合要求。测试例子:测试输入:asd123asd123->返回0测试输入:12345612356789->返回第一个不同字符:'4'和'5',差值-1。注意:第二个例子中,第一个字符串的“123456”和第二个字符串的“12356789”,在比较完“123”后,第一个字符串的第四个字符是'4',第二个字符串的第四个字符是'5',所以返回'4'-'5'=-1。因此,我们按照这个思路编写函数。但是,引用[5]中提供了另一种写法,使用两个循环条件,并在循环中判断不等然后跳出,最后再判断结束情况。我们的写法更简洁,与引用[3]相同。因此,我们在函数中采用上述写法。注意:题目要求函数名为`stringCompared`,注意大小写。我们将函数代码补充到给定的编辑器中(在Begin-End之间)。</think>### C语言字符串比较函数实现(返回ASCII码差值)
根据任务要求,我将实现一个自定义字符串比较函数`stringCompared`,该函数使用指针遍历字符串并返回ASCII码差值。以下是符合要求的实现:
```c
#include <stdio.h>
int stringCompared(char *p1, char *p2) {
// 遍历字符串直到遇到不同字符或结束符
while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2) {
p1++;
p2++;
}
// 返回第一个不同字符的ASCII差值
return *p1 - *p2;
}
int main() {
char str1[100], str2[100];
// 输入两个字符串
scanf("%s %s", str1, str2);
// 调用比较函数并输出结果
int result = stringCompared(str1, str2);
printf("%d\n", result);
return 0;
}
```
#### 实现原理:
1. **指针遍历**
- `while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)` 同时遍历两个字符串
- 当遇到结束符`\0`或不同字符时跳出循环
2. **差值计算**
- 返回表达式`*p1 - *p2`:
- 相等时返回 `0`(如`'a'-'a'=0`)
- 不等时返回实际ASCII差值(如`'a'-'b'=-1`)
- 包含字符串长度不等的情况(`\0`的ASCII值为0)
3. **符合标准**
- 实现与C标准库`strcmp()`相同的比较逻辑[^1]
- 返回值的符号和绝对值符合题目要求[^3]
#### 示例行为:
| 输入1 | 输入2 | 返回值 | 原因 |
|------------|------------|--------|-------------------|
| "apple" | "apple" | 0 | 完全相等 |
| "apple" | "apples" | -115 | `'\0' - 's' = -115` |
| "zebra" | "apple" | 25 | `'z' - 'a' = 25` |
| "123" | "122" | 1 | `'3' - '2' = 1` |
这个实现严格遵循了指针操作字符串的原则,通过指针自增(`p1++`)遍历字符串,避免了数组下标的使用,符合题目对指针操作的要求[^2][^5]。
阅读全文
相关推荐


















