You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言地址传递实现ortakhesap函数时输出异常问题求助

C语言地址传递实现ortakhesap函数时输出异常问题求助

嗨,我帮你找到了问题的核心原因,咱们一步步来梳理:

核心错误:运算符优先级导致的指针操作偏差

在ortakhesap函数里,你写了这行关键代码:

*ortak++;

这里的问题出在运算符优先级上:自增++的优先级比解引用*更高,所以这行代码实际执行的是*(ortak++)——它没有给ortak指向的变量加1,反而把指针ortak本身往后移动了一个int的内存位置!这就导致你最终输出的是一块随机内存的值,自然会出现“荒谬的输出”。

正确的写法是给解引用操作加上括号,确保先访问指针指向的变量,再执行自增:

(*ortak)++;

其他可以优化的细节(非核心,但能提升代码健壮性)

  • gets函数不安全:这个函数已经被C标准废弃,它不会检查输入长度,容易引发缓冲区溢出。建议换成fgets,同时手动去除读取到的换行符:
    fgets(dizi, can, stdin);
    dizi[strcspn(dizi, "\n")] = '\0';
    
  • ASCII码直接写数字可读性差:你判断小写字母用了dizi1[i]>96 && dizi1[i]<123,换成dizi1[i] >= 'a' && dizi1[i] <= 'z'会更直观,其他开发者读代码也更容易理解。
  • 多空格场景处理:原代码只会跳过一个空格,如果输入的两个单词之间有多个空格,会导致第二个单词无法正确读取,可以加一段循环跳过所有连续空格:
    while(dizi1[i] == ' ') {
        i++;
    }
    

修正后的ortakhesap函数代码

void ortakhesap(int *ortak,char dizi1[can])
{
    *ortak=0;
    int i=0;
    int konum=0;
    int num1[26]={0};
    int num2[26]={0};

    // 处理第一个单词(到空格为止)
    while(dizi1[i])
    {
        if(dizi1[i] == ' ')
        {
            break;
        }
        else if(dizi1[i] >= 'a' && dizi1[i] <= 'z')
        {
            konum = dizi1[i] - 'a';
            num1[konum]++;
        }
        i++;
    }

    // 跳过所有连续空格
    while(dizi1[i] == ' ') {
        i++;
    }

    // 处理第二个单词(到非小写字母为止)
    while(dizi1[i])
    {
        if(dizi1[i] >= 'a' && dizi1[i] <= 'z')
        {
            konum = dizi1[i] - 'a';
            num2[konum]++;
        }
        else{
            break;
        }
        i++;
    }

    // 统计公共字符数量
    for(i=0;i<26;i++)
    {
        if(num1[i] != 0 && num2[i] != 0)
        {
            (*ortak)++;  // 修正运算符优先级问题
        }
    }

    printf("2 kelimenin ortak harf sayisi: %d",*ortak);
}

这样修改之后,ortakhesap函数就能和你不用函数时的逻辑保持一致,正常输出两个单词的公共字符数量啦。

备注:内容来源于stack exchange,提问作者Khansokhua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:53:06