VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 574|回复: 5

[已解决]函数的默认参数的问题

[复制链接]
47_avatar_middle
最佳答案
0 
在线会员 发表于 2022-4-14 15:29:49 | 显示全部楼层 |阅读模式
本帖最后由 Are0s 于 2022-4-15 11:23 编辑

对于参数输入true功能正常,输入false为什么全都是大写,找了半天语法感觉也也没问题,百思不得其解


#include <iostream>
#include <string>
using namespace std;

/*功能为对字符串指定位置的字符变换为大写。
str 参数为字符串的指针;
str_len 为字符串的长度;
b_odd_pos 为true的时候,就要将 str 字符串中的奇数位置的字符变为大写,同时将非奇数位置的字符变为小写;
b_odd_pos 为false的时候,就要将 str 字符串中的奇数位置的字符变为小写,同时将非奇数位置的字符变为大写;
奇数指的是:1, 3, 5, 7, 9, 11, 13, 15, 17, 19...以此类推*/

bool string_upper_diy(char str[], int str_len, bool b_odd_pos=true)
{
        for (int i = 0; i < str_len; i++)
        {
                if (b_odd_pos)//输入为true
                {
                        if (((i + 1) % 2 != 0) && str >= 'a'&&str <= 'z')
                        {//是奇数位且小写
                                str -= 32;//改成大写,是大写没必要改
                        }
                        else
                        {
                                if (str >= 'A'&&str <= 'Z')//偶数位且为大写
                                {
                                        str += 32;//改成小写
                                }

                        }
                }
                else
                {
                        if (((i + 1) % 2 != 0) && str >= 'A'&&str <= 'Z')
                        {//是奇数位且大写
                                str += 32;//改成小写,是小写没必要改
                        }
                        else
                        {
                                if (str >= 'a'&&str <= 'z')//非奇数位且为小写
                                {
                                        str -= 32;//改成大写
                                }
                        }
                }
        }
        return true;
}

int main()
{
        char test1[50] = "asjgduy";
        string_upper_diy(test1, strlen(test1), false);
        cout << test1 << endl;
        return 0;
}
最佳答案
17_avatar_small
2022-4-14 16:43:18
本帖最后由 yoobaby 于 2022-4-14 17:06 编辑

                        if (((i + 1) % 2 != 0) && str >= 'A'&&str <= 'Z') //这句你如果传入的是小写,那就永远不会成立,怎么可能改。
                        {//是奇数位且小写
                                str += 32;//改成大写,是大写没必要改
                        }

你这判断得字母是大写,才改成小写。。你逻辑自己搞错了。+32是改成小字。

你应该是大小写的数值搞混乱了。。

  1.         if (((i + 1) % 2 != 0) )
  2.         {
  3.             //奇位,大写就改成小写
  4.             if (str[i] >= 'A' && str[i] <= 'Z')
  5.             {
  6.                 str[i] += 32;//改成小写
  7.             }

  8.         }
  9.         else
  10.         {
  11.             //非奇数位且是小写,就改成大写
  12.             if (str[i] >= 'a' && str[i] <= 'z')
  13.             {
  14.                 str[i] -= 32;//改成大写
  15.             }
  16.         }
复制代码




上一篇:MFC,有没有办法往网页中的编辑框写入一串字符
下一篇:MFC如何调用dll内返回值是数组的函数
57_avatar_middle
最佳答案
25 
在线会员 发表于 2022-4-14 17:07:54 | 显示全部楼层
b_odd_pos 为false的时候。对"asjgduy"依次代入进行判断:
if (((i + 1) % 2 != 0) && str[i] >= 'A'&&str[i] <= 'Z')

①i == 0时,字符为a,((i + 1) % 2 != 0)为true,但是a是小写字符,不符合后面的判断,str[i] >= 'A'&&str[i] <= 'Z'的结果是false,进入else的代码块,即转换为大写。
② i == 1,((i + 1) % 2 != 0)为false,进行大写转换。

else所达标的情况包含了三种,
为奇数且为小写、为偶数且为小写、为偶数且为大写

17_avatar_middle
最佳答案
41 
在线会员 发表于 2022-4-14 16:43:18 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 yoobaby 于 2022-4-14 17:06 编辑

                        if (((i + 1) % 2 != 0) && str >= 'A'&&str <= 'Z') //这句你如果传入的是小写,那就永远不会成立,怎么可能改。
                        {//是奇数位且小写
                                str += 32;//改成大写,是大写没必要改
                        }

你这判断得字母是大写,才改成小写。。你逻辑自己搞错了。+32是改成小字。

你应该是大小写的数值搞混乱了。。

  1.         if (((i + 1) % 2 != 0) )
  2.         {
  3.             //奇位,大写就改成小写
  4.             if (str[i] >= 'A' && str[i] <= 'Z')
  5.             {
  6.                 str[i] += 32;//改成小写
  7.             }

  8.         }
  9.         else
  10.         {
  11.             //非奇数位且是小写,就改成大写
  12.             if (str[i] >= 'a' && str[i] <= 'z')
  13.             {
  14.                 str[i] -= 32;//改成大写
  15.             }
  16.         }
复制代码
89_avatar_middle
最佳答案
2 
在线会员 发表于 2022-4-14 19:08:37 | 显示全部楼层
打断点,单步调试就知道了
47_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-4-15 11:23:48 | 显示全部楼层
JLDawson 发表于 2022-4-14 17:07
b_odd_pos 为false的时候。对"asjgduy"依次代入进行判断:
if (((i + 1) % 2 != 0) && str >= 'A'&&str =  ...

好的谢谢!
47_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-4-15 11:26:59 | 显示全部楼层
yoobaby 发表于 2022-4-14 16:43
if (((i + 1) % 2 != 0) && str >= 'A'&&str

备注是直接复制忘了改了
然后我明白了,我这个区分的逻辑有问题,当if不满足时直接转去看else了,忽略了if中的奇数位不满足情况时候没有解决办法
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-28 11:30

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表