完善以下程序#include<stdio.h> int strcmp(char *p1,char *p2){ /*********Begin*********/ while(*p1 && *p2 && (*p1 == *p2)) { p1++; p2++; } return (*p2 - *p1); /*********End**********/ } int main() { char a[110],b[110]; scanf("%s%s",a,b); if(strcmp(a,b)>0) printf("%s", a); else printf("%s", b); return 0; }
时间: 2023-07-01 07:27:52 浏览: 203
这个程序看起来是比较简单的字符串比较程序,其中使用了自定义的 `strcmp` 函数来比较两个字符串的大小,并输出较大的那个字符串。
然而,这里的 `strcmp` 函数实现并不完美,存在以下问题:
1. 函数名与系统库函数名重复,在使用时可能会引起混淆;
2. 函数返回值的含义与标准库函数 `strcmp` 不同,应该返回两个字符串的比较结果,而不是一个字符的差值;
3. 函数实现中只考虑了两个字符串的长度相同的情况,如果两个字符串长度不同,将会出现错误结果。
因此,我们可以对程序进行如下完善:
1. 修改函数名为 `my_strcmp` 等不与系统库函数名冲突的函数名。
2. 修改函数返回值为两个字符串的比较结果,即当 `p1` 大于 `p2` 时返回一个正数,当 `p1` 等于 `p2` 时返回 0,当 `p1` 小于 `p2` 时返回一个负数。
3. 修改函数实现,考虑两个字符串长度不同的情况,如果到某个字符串的结尾,直接比较两个字符串长度的差值即可。
修改后的程序如下:
相关问题
asdfghghjk xcfghyujkk aawertgbof asdfghghjk acfghyujkk xawertgbof根据上述运行结果修改下列程序#include <stdio.h> void sort(char *p1, char *p2, char *p3); int main() { char a[100],b[100],c[100],*p1,*p2,*p3; scanf("%s%s%s", &a, &b, &c); p1=a;p2=b;p3=c; sort(p1, p2, p3); printf("%s %s %s\n", a, b, c); return 0; } void sort(char *p1, char *p2, char *p3) { char t; if(strcmp(p1,p2)>0) { t = *p1; *p1 = *p2; *p2= t; } if(strcmp(p2,p3)>0) { t = *p2; *p2 = *p3; *p3 = t; } if(strcmp(p1,p3)>0) { t = *p3; *p1 = *p3; *p3 = t; } }
这段程序存在一些问题,需要修改。首先,scanf函数中不需要使用&符号,因为数组名本身就是指向数组首元素的指针,可以直接传递给函数。其次,在sort函数中交换字符时,应该使用指针操作,而不是单纯的字符变量交换。最后,sort函数中的if语句顺序有误,应该先比较p1和p3,再比较p1和p2,最后比较p2和p3。修正后的程序如下:
```c
#include <stdio.h>
#include <string.h>
void sort(char *p1, char *p2, char *p3);
int main() {
char a[100], b[100], c[100], *p1, *p2, *p3;
scanf("%s%s%s", a, b, c);
p1 = a;
p2 = b;
p3 = c;
sort(p1, p2, p3);
printf("%s %s %s\n", a, b, c);
return 0;
}
void sort(char *p1, char *p2, char *p3) {
char t;
if (strcmp(p1, p3) > 0) {
t = *p1;
*p1 = *p3;
*p3 = t;
}
if (strcmp(p1, p2) > 0) {
t = *p1;
*p1 = *p2;
*p2 = t;
}
if (strcmp(p2, p3) > 0) {
t = *p2;
*p2 = *p3;
*p3 = t;
}
}
```
优化以下代码,要求:班级成绩管理系统 (1)利用结构体和简单的链表,实现一个班学生成绩的管理,至少可以输入20个学生的成绩。 (2)成绩管理功能包括:输入、输出,利用new和delete运算符添加和删除班级成绩 (1)利用结构体和简单的链表(关于链表的知识,自己查阅资料学习),实现一个班学生成绩的管理。#include<stdio.h> #include<iostream> #include<windows.h> using namespace std; typedef struct student { char name[20]; int score; student* next; }stu; stu* head; void input() { stu* p1, * p2; p1 = (stu*)new stu; head = p1; while (p1 != NULL) { cout << "输入姓名" << endl; cin >> p1->name; cout << "输入成绩" << endl; cin >> p1->score; cout << "是否继续输入?(1.是 2.否)"; int a; cin >> a; if (a == 1) { p2 = p1; p1 = (stu*)new stu; p2->next = p1; continue; } else if (a == 2) { p1->next = NULL; break; } } } void listprint() { stu* p1 = head; while (p1 != NULL) { cout << 1; cout << "姓名: " << p1->name << " 成绩:" << p1->score << endl; p1 = p1->next; } } void shanchu() { char c[20]; cout << "请输入删除的学生姓名" << endl; cin >> c; stu* p1 = head, * p2; while (p1 != NULL) { p2 = p1->next; if (strcmp(p2->name, c) == 0) { p1->next = p2->next; break; }p1 = p1->next; } } int main() { int a = 0; while (1) { cout << "1.输入成绩 2.输出成绩 3.删除" << endl;cin >> a; switch (a) { case 1: { input(); system ("cls"); continue; } case 2: { listprint(); continue; } case 3: { shanchu(); continue; } default: { break; } } break; } }
以下是优化后的代码:
#include <iostream>
#include <string>
using namespace std;
struct Student {
string name;
int score;
Student* next;
};
void addStudent(Student*& head, string name, int score) {
Student* newStudent = new Student;
newStudent->name = name;
newStudent->score = score;
newStudent->next = head;
head = newStudent;
}
void deleteStudent(Student*& head, string name) {
if (head == NULL) {
return;
}
if (head->name == name) {
Student* temp = head;
head = head->next;
delete temp;
return;
}
Student* current = head;
while (current->next != NULL && current->next->name != name) {
current = current->next;
}
if (current->next == NULL) {
return;
}
Student* temp = current->next;
current->next = current->next->next;
delete temp;
}
void printStudents(Student* head) {
while (head != NULL) {
cout << head->name << " " << head->score << endl;
head = head->next;
}
}
int main() {
Student* head = NULL;
int choice;
string name;
int score;
while (true) {
cout << "1. Add student" << endl;
cout << "2. Delete student" << endl;
cout << "3. Print students" << endl;
cout << "4. Exit" << endl;
cout << "Enter your choice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Enter student name: ";
cin >> name;
cout << "Enter student score: ";
cin >> score;
addStudent(head, name, score);
break;
case 2:
cout << "Enter student name: ";
cin >> name;
deleteStudent(head, name);
break;
case 3:
printStudents(head);
break;
case 4:
return 0;
default:
cout << "Invalid choice" << endl;
}
}
return 0;
}
优化后的代码使用了指针和动态内存分配,可以更好地管理学生信息。同时,使用了switch语句来实现菜单功能,代码更加简洁易懂。
阅读全文