C 为什么我的number变量在运行';插入';功能?

C 为什么我的number变量在运行';插入';功能?,c,C,我在学校作业中一直在看我的这段代码,但我不明白为什么整数变量在我通过值将其传递到函数后发生了变化,尽管我没有在函数中修改它 #include <stdio.h> #include <stdlib.h> void Q1(); void Q1_Remove (char **ptr_string); void Q1_Insert (char **ptr_string, int length); int main() { Q1(); return 0; }

我在学校作业中一直在看我的这段代码,但我不明白为什么整数变量在我通过值将其传递到函数后发生了变化,尽管我没有在函数中修改它

#include <stdio.h>
#include <stdlib.h>

void Q1();
void Q1_Remove (char **ptr_string);
void Q1_Insert (char **ptr_string, int length);

int main()
{
    Q1();

    return 0;
}

void Q1 () {
    int number;
    printf("How many characters do you want to input: ");
    scanf("%d", &number);
    char *string = malloc(number + 1);
    printf("Input the string: ");
    scanf("%s", string);
    printf("The string is: %s\n", string);

    int option;
    do {
        printf("Do you want to 1-Insert, 2-Remove or 3-Quit: ");
        scanf("%d", &option);
        switch (option) {
            case 1:
                Q1_Insert(&string, number);
                break;
            case 2:
                Q1_Remove(&string);
                break;
        }
        if (option == 1 || option == 2) {
            printf("Resulting string: %s\n", string);
        }
    } while (option == 1 || option == 2);

    free(string);
}

void Q1_Remove (char **ptr_string) {
    (*ptr_string)++;
}

void Q1_Insert (char **ptr_string, int length) {
    int curr_len = strlen(*ptr_string);
    int i;
    printf("length is %d and curr_len is %d", length, curr_len);
    if (curr_len == length) {
        for (i = curr_len - 1; i > 0; --i) {
            *(ptr_string + i) = *(ptr_string + i - 1);
        }
    } else {
        (*ptr_string)--;
    }
    char to_insert;
    printf("What is the character you want to insert: ");
    scanf(" %c", &to_insert);
    **ptr_string = to_insert;
}
(编辑2)
删除了变量编号的常量,并将其添加到顶部的声明中。编辑以添加标题

主要问题是如何在字符串中洗牌字符。您正在这样做:

for (i = curr_len - 1; i > 0; --i) {
    *(ptr_string + i) = *(ptr_string + i - 1);
}
但是,实际的字符串指针是
*ptr\u string
。由于您使用的是
ptr\u string+i
,因此它将
ptr\u string
视为一个指针数组,并且您在
main
中定义的
string
指针之后写入整个堆栈内存。这将是破坏你的
数字
价值的因素之一

相反,您需要这样做:

*(*ptr_string + i) = *(*ptr_string + i - 1);
就我个人而言,我会使用数组表示法,它更具可读性:

(*ptr_string)[i] = (*ptr_string)[i - 1];

或者干脆完全废弃循环,使用
memmove

我们看不到图像。但无论如何,请不要发布文本图像。直接把它作为文本粘贴到问题中。这是你真正的完整代码吗?您需要在调用函数之前声明它们。另外,
const int number
是什么,因为它显然不是一个常数?是的,这是我实际的完整代码,它在运行时没有我声明函数。我试图使数字成为常数,因为在第二次插入后它将变为随机数,但没有效果。它运行了,但现在没有正确运行,是吗?感谢反馈!我已经编辑了代码,删除了整数之前的常量,并将其添加到声明中,但仍然出现相同的错误。
(*ptr_string)[i] = (*ptr_string)[i - 1];