【问题标题】:swap strings function in c with pointers用指针交换c中的字符串函数
【发布时间】:2020-08-14 14:08:13
【问题描述】:

当我尝试在函数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);
    }
}

【问题讨论】:

  • 你没有交换指针,只是复制它们。
  • 工作正常。您更改了局部变量中的指针。你不能在 student->name 上使用这个方法,因为它是一个数组,而不是一个指针。
  • scanf("%s", &amp;pupil-&gt;name); 中,char 数组参数不需要地址运算符。
  • 你还有两个我可以看到的。

标签: c string pointers


【解决方案1】:

Replace_Strings(&amp;ptr_old_stud_name,&amp;ptr_new_stud_name);ptr_old_stud_nameptr_new_stud_name 的地址传递给ReplaceStrings

ptr_old_stud_nameptr_new_stud_name 是局部变量。第一个是已设置为指向students-&gt;name 的指针。第二个是已经设置为指向new_name的指针。

Replace_Strings 将传递给它的指针的第一件事更改为传递给它的指针的第二件事。因此它将ptr_old_stud_name 更改为具有ptr_new_stud_name 的值。

结果是局部变量ptr_old_stud_name有了新值。这不会改变它指向的东西,students-&gt;name

更具体地说,ptr_old_stud_name 指向students-&gt;name 的第一个字符。 students-&gt;name 是一个数组,不能通过改变指向它的指针来改变它,也不能改变它的地址。要更改其内容,您必须将新值复制到其中的字节中,您可以使用strcpy 将字节从new_name 复制到其中。

【讨论】:

    【解决方案2】:

    您的函数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);
            }
        }
    }
    

    Update_Student(students, SIZE); 的身份从main 拨打电话

    另请注意,在阅读命令时应忽略空格,方法是在 %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, int count) {
        char cur_name[50], new_name[50];
        printf("You can update name, 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, students[i].name) == 0) {
                strcpy(students[i].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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2022-08-05
      相关资源
      最近更新 更多