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
相关产品推荐
相关产品推荐

