旅人_在路上 2024-10-05 17:07 采纳率: 33.3%
浏览 11

为什么我的指针不能跨函数改变变量的值?

为什么我自定义的函数没有用?是指针用错了吗?st1还是原来的值

#include<stdio.h>
#include<string.h>
#define SIZE 30
char* string_in(char* st1, char* st2);
int main(void) {
    char st1[SIZE];
    char st2[SIZE];
    char* st = st1;
    fgets(st1, SIZE, stdin);
    fgets(st2, SIZE, stdin);
    string_in(st1, st2);
    printf("%s", st1);//为啥函数写了白写,就是不传递
    return 0;

}

char* string_in(char* st1, char* st2) {//找相同,从哪个字符开始相同
    int count = 0;
    int Long = strlen(st2);
    
    while (*st1 != '\0' && count < Long)
    {
        if (*(st1 + count) == *(st2 + count))
            count++;
        else {
            count = 0;
            st1++;
        }
        if (count == Long) return st1;
        else return NULL;
    }


}

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-10-05 17:08
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的代码中的问题在于你试图通过指针改变函数外部变量的值,但是你并没有正确地使用指针。在 C 语言中,函数的参数传递是通过值传递的方式进行的,也就是说函数内部对参数的修改并不会影响到函数外部的值。如果你想要通过函数改变外部变量的值,你需要传递变量的地址(也就是指针)给函数。在你的代码中,虽然你定义了指针 char* st = st1; 并尝试将其传递给 string_in 函数,但在函数内部并没有通过这个指针去改变 st1 的值。此外,你在 string_in 函数中的逻辑也有些问题,这将导致无法正确找到相同的字符。下面是修正后的代码:

    #include<stdio.h>
    #include<string.h>
    #define SIZE 30
    
    char* string_in(char* st1, char* st2);
    
    int main(void) {
        char st1[SIZE];
        char st2[SIZE];
        fgets(st1, SIZE, stdin);
        fgets(st2, SIZE, stdin);
        // 在这里获取 st1 的地址并传递给函数
        char* result = string_in(&st1, st2);
        if (result != NULL) {
            printf("From %s: starting from index %ld\n", st1, result - st1); // 输出从哪个字符开始相同以及索引位置
        } else {
            printf("%s", st1); // 没有找到相同的字符序列
        }
        return 0;
    }
    
    char* string_in(char* st1, char* st2) { // 找相同,从哪个字符开始相同并返回这个字符的索引位置
        int count = 0;
        int len_st2 = strlen(st2); // 使用一个变量存储 st2 的长度,避免重复计算长度
        while (*st1 != '\0') { // 注意这里的循环应该持续进行到 st1 的末尾,而不是提前退出循环
            if (count < len_st2 && *(st1 + count) == *(st2 + count)) { // 如果找到了匹配的字符,继续比较下一个字符
                count++;
            } else { // 如果不匹配或者到达 st2 的末尾,重置计数器并检查下一个字符是否匹配 st2 的第一个字符
                count = 0; 
                if (*st1 == *st2) { // 如果找到了匹配的字符,返回当前位置作为起始点(即下一个字符的索引)
                    return st1; 
                } else { // 继续检查下一个字符是否匹配第一个字符
                    st1++; 
                } 
            } 
            if (count == len_st2) return st1 - len_st2; // 如果完全匹配找到了相同字符串的起始位置(即前一个字符的位置),注意要减去 len_st2 来得到正确的索引位置(因为数组索引是从 0 开始的)
        } 
        return NULL; // 没有找到匹配的字符串序列,返回 NULL 表示失败或没有找到匹配项。注意这里应该返回 NULL 而不仅仅是结束循环。否则函数会提前结束并返回不正确的结果。 
    }
    

    在这个修正后的代码中,string_in 函数接收两个字符串的地址(指针),然后查找从哪个字符开始这两个字符串相同。如果找到了匹配的字符串序列,函数将返回该序列在 st1 中的起始位置(即下一个字符的索引)。如果没有找到匹配的字符串序列,函数将返回 NULL。在 main 函数中,我们调用 string_in 函数并打印结果。如果找到了匹配的字符串序列,我们将打印出起始位置和相应的字符串;否则,我们将打印原始字符串。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月5日