如何解决在C中使用指针交换字符串函数
当我尝试在函数Update_student
中的字符串之间交换时,它没有成功。为什么?
#include <stdio.h>
#include <string.h>
#define SIZE 1
struct student {
int id_number;
char name[50];
char sex[6];
int quiz_score[2];
int total_score;
};
void Add_Student_Records(struct student *pupil) {
printf("ID:");
scanf("%d",&pupil->id_number);
printf("Name: ");
scanf("%s",&pupil->name);
printf("Sex :");
scanf("%s",&pupil->sex);
for (int i = 0; i < 2; i++) {
printf("Quit score %d:",i + 1);
scanf("%d",&pupil->quiz_score[i]);
}
pupil->total_score = pupil->quiz_score[0] + pupil->quiz_score[1];
return;
}
void Add_Students(struct student *students) {
for (int i = 0; i < SIZE; i++) {
printf("Student %d:\n",i + 1);
Add_Student_Records(students);
}
return;
}
void Print_Students(struct student *students) {
for (int i = 0; i < SIZE; i++) {
printf("Student %d details: \n",i + 1);
printf("ID:%d\n",students->id_number);
printf("Name:%s\n",students->name);
printf("Sex:%s\n",students->sex);
for (int i = 0; i < 2; i++) {
printf("Quit score %d:\n",students->quiz_score[i]);
}
printf("Total score: %d\n",students->total_score);
students++;
}
return;
}
void Replace_Strings(char **old_string,char **new_string) {
*old_string = *new_string;
return;
}
void Update_Student(struct student *students) {
int i = 0;
char name[50],new_name[50],cur_name[50];
printf("You can update name,and scores.\n");
printf(" current Name: ");
scanf("%s",name);
printf("new name: ");
scanf("%s",&new_name);
while (i < SIZE) {
strcpy(cur_name,students->name);
if (strcmp(cur_name,name) == 0) {
char *ptr_old_stud_name = students->name;
char *ptr_new_stud_name = new_name;
Replace_Strings(&ptr_old_stud_name,&ptr_new_stud_name);
}
i++;
students++;
}
return;
}
int main() {
struct student students[SIZE];
char ch;
/*1.Add student,2. Print student*/
printf("1.Add student\n2.Print students\n3.Update student\n");
scanf("%c",&ch);
while (ch != 'E') {
if (ch == '1') {
Add_Students(&students[0]);
}
else if (ch == '2') {
Print_Students(&students[0]);
}
else if (ch =='3') {
Update_Student(&students[0]);
}
printf("Another operation:\t");
scanf("%c",&ch);
}
}
解决方法
Replace_Strings(&ptr_old_stud_name,&ptr_new_stud_name);
将ptr_old_stud_name
和ptr_new_stud_name
的地址传递到ReplaceStrings
。
ptr_old_stud_name
和ptr_new_stud_name
是局部变量。第一个是已设置为指向students->name
的指针。第二个是已设置为指向new_name
的指针。
Replace_Strings
会将传递指针的第一项更改为传递指针的第二项。因此它将ptr_old_stud_name
更改为值为ptr_new_stud_name
。
结果是局部变量ptr_old_stud_name
具有新值。这不会更改它指向的内容students->name
。
更具体地说,ptr_old_stud_name
指向students->name
的第一个字符。 students->name
是一个数组,不能通过更改指向它的指针来更改,并且其地址也不能更改。要更改其内容,必须将新值复制到其中的字节中,这可以通过使用strcpy
从new_name
中复制字节来完成。
您的函数Update_student
令人困惑,您应该遍历学生数组,并将学生的名字与cur_name
进行比较,并在匹配时替换名字。
您还应该传递要处理的学生人数。
这是修改后的版本:
void Update_Student(struct student *students,int count) {
char cur_name[50],new_name[50];
printf("You can update name,and scores.\n");
printf(" current Name: ");
scanf("%49s",cur_name);
printf("new name: ");
scanf("%49s",new_name);
for (int i = 0; i < count; i++) {
if (strcmp(cur_name,students[i].name) == 0) {
strcpy(students[i].name,new_name);
}
}
}
以main
的身份从Update_Student(students,SIZE);
拨打电话
还请注意,在读取命令时,您应该忽略空格,方法是在%c
前添加一个空格:
scanf(" %c",&ch);
这是修改版,可容纳多名学生:
#include <stdio.h>
#include <string.h>
#define SIZE 10
struct student {
int id_number;
char name[50];
char sex[6];
int quiz_score[2];
int total_score;
};
int Add_Student_Records(struct student *pupil) {
printf("ID:");
if (scanf("%d",&pupil->id_number) != 1)
return 0;
printf("Name: ");
if (scanf("%49s",pupil->name) != 1)
return 0;
printf("Sex :");
if (scanf("%1s",pupil->sex) != 1)
return 0;
for (int i = 0; i < 2; i++) {
printf("Quiz score %d:",i + 1);
if (scanf("%d",&pupil->quiz_score[i]) != 1)
return 0;
}
pupil->total_score = pupil->quiz_score[0] + pupil->quiz_score[1];
return 1;
}
int Add_Students(struct student *students,int count) {
int i;
for (int i = 0; i < count; i++) {
printf("Student %d:\n",i + 1);
if (Add_Student_Records(students + i) == 0)
break;
}
return i;
}
void Print_Students(struct student *students,int count) {
for (int i = 0; i < count; i++) {
printf("Student %d details: \n",i + 1);
printf("ID:%d\n",students->id_number);
printf("Name:%s\n",students->name);
printf("Sex:%s\n",students->sex);
for (int i = 0; i < 2; i++) {
printf("Quit score %d:\n",students->quiz_score[i]);
}
printf("Total score: %d\n",students->total_score);
students++;
}
}
void Update_Student(struct student *students,and scores.\n");
printf(" current Name: ");
if (scanf("%49s",cur_name) != 1)
return;
printf("new name: ");
if (scanf("%49s",new_name) != 1)
return;
for (int i = 0; i < count; i++) {
if (strcmp(cur_name,new_name);
}
}
}
int main() {
struct student students[SIZE];
int n = 0;
char ch = 'E';
/* print the menu */
printf("1. Add student\n"
"2. Print students\n"
"3. Update student\n");
scanf(" %c",&ch);
while (ch != 'E') {
if (ch == '1') {
if (n == SIZE) {
printf("student array is full\n");
} else {
/* add more students */
n += Add_Students(&students[n],SIZE - n);
}
} else
if (ch == '2') {
Print_Students(students,n);
} else
if (ch =='3') {
Update_Student(students,n);
}
scanf("%*[^\n]"); // consume the rest of the pending input line
printf("Another operation:\t");
if (scanf(" %c",&ch) != 1)
break;
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。