strcmp函数功能描述
时间: 2023-10-24 11:28:51 浏览: 85
strcmp函数是C语言中的字符串比较函数,用于比较两个字符串的大小。该函数的功能描述如下:
1. 比较两个字符串s1和s2的大小,如果相等则返回0,如果s1小于s2则返回负数,如果s1大于s2则返回正数。
2. 比较的方式为逐个字符比较,从字符串的第一个字符开始,如果两个字符相等,则继续比较下一个字符,直到出现不相等的字符为止。
3. 如果两个字符串的长度不同,则在比较到短字符串的末尾时,会将其余字符看作ASCII码值为0的字符继续比较,直到找到不相等的字符为止。
4. strcmp函数属于标准C库函数,其函数原型为:int strcmp(const char *s1, const char *s2)。其中,s1和s2分别为要比较的两个字符串的指针。
相关问题
使用c++,请通过重载函数,创建自己的 string 类,并命名为MyString, MyString 类是一个抽象数据类型,用来处理字符串,实现以下功能: 1)自动实现内存的动态分配,程序员无须关心为一个数组分配多少个字节的空间; 2)可以将string 对象直接赋值给MyString 对象,无须调用strcpy函数; 3)采用“+=”运算符可以连接两个 MyString 对象,无须使用 strcat 函数。 4)采用==、<、> 和!=运算符实现两个对象的比较,无须调用 strcmp 函数。
好的,以下是一个简单的示例代码,实现了您所描述的 MyString 类的基本功能:
```c++
#include <iostream>
#include <cstring>
class MyString {
private:
char* str;
public:
MyString() : str(nullptr) {}
MyString(const char* s) {
if (s) {
str = new char[strlen(s) + 1];
strcpy(str, s);
} else {
str = nullptr;
}
}
MyString(const MyString& other) {
if (other.str) {
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
} else {
str = nullptr;
}
}
~MyString() {
delete[] str;
}
MyString& operator=(const char* s) {
if (str) {
delete[] str;
str = nullptr;
}
if (s) {
str = new char[strlen(s) + 1];
strcpy(str, s);
}
return *this;
}
MyString& operator=(const MyString& other) {
if (this != &other) {
if (str) {
delete[] str;
str = nullptr;
}
if (other.str) {
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
}
}
return *this;
}
MyString& operator+=(const MyString& other) {
if (other.str) {
char* temp = new char[strlen(str) + strlen(other.str) + 1];
strcpy(temp, str);
strcat(temp, other.str);
if (str) {
delete[] str;
}
str = temp;
}
return *this;
}
bool operator==(const MyString& other) const {
return strcmp(str, other.str) == 0;
}
bool operator<(const MyString& other) const {
return strcmp(str, other.str) < 0;
}
bool operator>(const MyString& other) const {
return strcmp(str, other.str) > 0;
}
bool operator!=(const MyString& other) const {
return strcmp(str, other.str) != 0;
}
friend std::ostream& operator<<(std::ostream& os, const MyString& obj) {
if (obj.str) {
os << obj.str;
}
return os;
}
};
int main() {
MyString s1("hello");
MyString s2("world");
MyString s3 = s1;
MyString s4 = "hello";
std::cout << s1 << std::endl; // 输出 hello
std::cout << (s1 == s2) << std::endl; // 输出 0
std::cout << (s1 < s2) << std::endl; // 输出 1
std::cout << (s1 > s2) << std::endl; // 输出 0
std::cout << (s1 != s2) << std::endl; // 输出 1
s1 += s2;
std::cout << s1 << std::endl; // 输出 helloworld
s1 = s2 = s3 = s4;
std::cout << s1 << std::endl; // 输出 hello
std::cout << s2 << std::endl; // 输出 hello
std::cout << s3 << std::endl; // 输出 hello
std::cout << s4 << std::endl; // 输出 hello
return 0;
}
```
在这个示例代码中,我们定义了一个 MyString 类,并实现了以下操作:
1. 构造函数和析构函数:使用 new 动态分配内存,自动实现内存的动态分配和释放;
2. 赋值运算符:重载了 = 运算符,可以直接将一个字符串或另一个 MyString 对象赋值给当前对象,无须调用 strcpy 函数;
3. += 运算符:重载了 += 运算符,可以直接将两个 MyString 对象连接起来,无须使用 strcat 函数;
4. 比较运算符:重载了 ==、<、> 和 != 运算符,可以直接比较两个 MyString 对象,无须调用 strcmp 函数;
5. 友元函数:重载了 << 运算符,使得可以直接使用 cout 输出 MyString 对象。
当然,这只是一个简单的示例代码,实际上 MyString 类还可以实现更多的操作,比如子串查找、替换、插入、删除等等。
【问题描述】设计并实现一个简单的学生成绩管理系统,学生成绩信息包括学号、姓名和成绩(成绩为整数)。用带头结点的单链表管理学生成绩表,每个学生的信息依次从键盘输入。根据功能要求设计相应的链表基本操作函数。具体功能要求如下: (1) 输入学生信息,按输入顺序建立一个带头结点的单链表,直到输入学号为0结束,以列表的形式输出链表的所有学生信息; (2) 输入一个学生的姓名,在链表中查找该学生信息。如果存在,显示该生的所有信息;如果不存在,显示信息“No Answer”。 【输入形式】输入若干行学生信息(每个学生的基本信息之间以空格分开),每行输入一个学生基本信息,输入学号0表示输入结束,然后输入学生学号。 【输出形式】根据输入的学生信息,以列表形式输出学生信息(每个学生的基本信息之间用空格分开)。根据输入的学号查询学生信息,如果有,则输出该学生的所有信息,以空格分开;否则输出No Answer 【样例输入1】 1101 Jhon 96 1102 Tomas 85 1103 Danny 78 0 Danny 【样例输出1】 1101 Jhon 96 1102 Tomas 85 1103 Danny 78 1103 Danny 78 【样例输入2】 1101 Jhon 96 1102 Tomas 85 1103 Danny 78 0 Sam 【样例输出2】 1101 Jhon 96 1102 Tomas 85 1103 Danny 78 No Answer使用c语言编译并使用strcmp函数
以下是一个简单的学生成绩管理系统的实现,使用带头结点的单链表来管理学生信息。代码中包含了输入学生信息、建立链表、输出链表信息、查找学生信息等基本操作函数。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct student {
int id; // 学号
char name[20]; // 姓名
int score; // 成绩
struct student *next; // 指向下一个学生的指针
} Student;
// 创建一个新的学生节点
Student *createStudent(int id, char *name, int score) {
Student *newStudent = (Student *)malloc(sizeof(Student));
newStudent->id = id;
strcpy(newStudent->name, name);
newStudent->score = score;
newStudent->next = NULL;
return newStudent;
}
// 在链表末尾添加一个学生节点
void addStudent(Student *head, Student *newStudent) {
Student *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = newStudent;
}
// 根据学号查找学生信息
Student *findStudentById(Student *head, int id) {
Student *p = head->next;
while (p != NULL) {
if (p->id == id) {
return p;
}
p = p->next;
}
return NULL;
}
// 输入学生信息,建立链表
void inputStudents(Student *head) {
int id, score;
char name[20];
printf("请输入学生信息(学号 姓名 成绩),以0结束:\n");
while (1) {
scanf("%d", &id);
if (id == 0) {
break;
}
scanf("%s %d", name, &score);
Student *newStudent = createStudent(id, name, score);
addStudent(head, newStudent);
}
}
// 输出链表中所有学生信息
void outputStudents(Student *head) {
Student *p = head->next;
printf("学号\t姓名\t成绩\n");
while (p != NULL) {
printf("%d\t%s\t%d\n", p->id, p->name, p->score);
p = p->next;
}
}
// 主函数
int main() {
// 创建带头结点的单链表
Student *head = (Student *)malloc(sizeof(Student));
head->next = NULL;
// 输入学生信息,建立链表
inputStudents(head);
// 输出链表中所有学生信息
outputStudents(head);
// 根据学号查找学生信息
int id;
printf("请输入要查找的学生姓名:\n");
scanf("%s", name);
Student *p = findStudentById(head, id);
if (p != NULL) {
printf("%d\t%s\t%d\n", p->id, p->name, p->score);
} else {
printf("No Answer\n");
}
// 释放链表内存
Student *q = head;
while (q != NULL) {
p = q->next;
free(q);
q = p;
}
return 0;
}
```
注意:在输入学生信息时,每行输入一个学生基本信息,输入学号0表示输入结束。在查找学生信息时,输入学生的姓名,程序会根据学号来查找学生信息。如果找到了该学生,则输出该生的所有信息;否则输出"No Answer"。
阅读全文