鱼C论坛

 找回密码
 立即注册
查看: 2624|回复: 14

[已解决]关于使用指针把大写字母变成小写字母的程序。

[复制链接]
发表于 2019-5-13 11:52:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么不可以的呢??
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main ()
  4. {
  5.     char *str = NULL;
  6.     str = (char *)malloc(sizeof(char) * 10);
  7.     scanf("%s",str);
  8.     while(*str++ != '\n')
  9.     {
  10.         if(*str >= 65 && *str <= 90)
  11.             *str += 32;
  12.     }
  13.     printf("%s\n", str);
  14.     free(str);

  15.     return 0;
  16. }
复制代码
最佳答案
2019-5-13 12:15:36
问题1,指针指到最后了,free()出错。
问题2,大小写转换处理(自己改下)
问题3,结束标志就是'\0'

参考代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main ()
  5. {
  6.     char *str = NULL, *tmp = NULL;
  7.     str = (char *)malloc(sizeof(char) * 10);
  8.         if(str == NULL)
  9.         {
  10.                 exit(1);
  11.         }
  12.         memset(str, '\0', sizeof(char) * 10);

  13.     scanf("%s",str); // gets(str);

  14.         tmp = str;
  15.         while(*tmp++ != '\0')
  16.     {
  17.         if(*tmp >= 65 && *tmp <= 90)
  18.             *tmp += 32;
  19.     }

  20.     printf("%s\n", str);
  21.     free(str);

  22.     return 0;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-13 12:05:51 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-13 12:23 编辑

      scanf() 会把 '\n'、空格、Tab 视为空白分隔字符统统加以滤除,所以,通过 scanf() 输入的字符串不可能包含 '\n' 字符
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main ()
  4. {
  5.     char * str = NULL                                                                                     ;
  6.     int c                                                                                                 ;
  7.     str = (char *)malloc(sizeof(char) * 80)                                                               ;
  8.     scanf("%s" , str)                                                                                     ;
  9.     for(c = 0 ; * (str + c) != '\0' ; c ++) if (* (str + c) >= 65 && * (str + c) <= 90) * (str + c) += 32 ; // str 的值不可以修改!!!
  10.     printf("%s\n", str)                                                                                   ;
  11.     free(str)                                                                                             ;
  12. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-13 12:15:36 | 显示全部楼层    本楼为最佳答案   
问题1,指针指到最后了,free()出错。
问题2,大小写转换处理(自己改下)
问题3,结束标志就是'\0'

参考代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main ()
  5. {
  6.     char *str = NULL, *tmp = NULL;
  7.     str = (char *)malloc(sizeof(char) * 10);
  8.         if(str == NULL)
  9.         {
  10.                 exit(1);
  11.         }
  12.         memset(str, '\0', sizeof(char) * 10);

  13.     scanf("%s",str); // gets(str);

  14.         tmp = str;
  15.         while(*tmp++ != '\0')
  16.     {
  17.         if(*tmp >= 65 && *tmp <= 90)
  18.             *tmp += 32;
  19.     }

  20.     printf("%s\n", str);
  21.     free(str);

  22.     return 0;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-13 17:53:58 | 显示全部楼层
jackz007 发表于 2019-5-13 12:05
scanf() 会把 '\n'、空格、Tab 视为空白分隔字符统统加以滤除,所以,通过 scanf() 输入的字符串不可 ...

可是为什么使用数组的时候就可以呢? (只把指针的地方换成数组)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-13 17:57:22 | 显示全部楼层
ba21 发表于 2019-5-13 12:15
问题1,指针指到最后了,free()出错。
问题2,大小写转换处理(自己改下)
问题3,结束标志就是'\0'

你的这个是不是重点是只用了memset把分配的10个char的内存 初始化为'\0'?  而我的问题是不是在字符串的结尾没有'\0'呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-13 18:06:09 | 显示全部楼层
1809228982 发表于 2019-5-13 17:53
可是为什么使用数组的时候就可以呢? (只把指针的地方换成数组)

      那你举个例子先,让我也开开眼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-13 19:01:39 | 显示全部楼层
1809228982 发表于 2019-5-13 17:57
你的这个是不是重点是只用了memset把分配的10个char的内存 初始化为'\0'?  而我的问题是不是在字符串的 ...

拜托学习用点心,问题给你指出了3点,代码也给你上了,你能看不明白?
反问你一下while(*str++ != '\0') 最后str的地址在哪?

不用心看,我觉得再给你多解释也是浪费口水。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-14 14:56:13 | 显示全部楼层
jackz007 发表于 2019-5-13 18:06
那你举个例子先,让我也开开眼。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main ()
  4. {
  5.     char str[10];
  6.     scanf("%s",str);
  7.     for(int i = 0; i != '\n'; i++)
  8.     {
  9.         if(str[i] >= 65 && str[i] <= 90)
  10.             str[i] += 32;
  11.     }
  12.     printf("%s\n", str);

  13.     return 0;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-14 15:03:20 | 显示全部楼层
ba21 发表于 2019-5-13 19:01
拜托学习用点心,问题给你指出了3点,代码也给你上了,你能看不明白?
反问你一下while(*str++ != '\0') ...

字符串结束的下一个内存地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 15:20:31 | 显示全部楼层
本帖最后由 Croper 于 2019-5-14 15:23 编辑


首先,同学,脑袋清醒一点:
  1. for(int i = 0; i != '\n'; i++)
复制代码

这个翻译过来不就是
  1. for(int i = 0; i != 10; i++)
复制代码

固定循环10次么

其次,scanf为一个字符串赋值的时候,会自动在字符串结尾加‘\0’,不然程序怎么知道字符串是不是结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 15:28:39 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-14 15:35 编辑


       只要用这个代码做一下测试,你就会知道,其实你的操作早就超出了字符串的长度范围,最终是因为到达数组边界才不得不停止循环的。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main ()
  5. {
  6.     char str[10]                                ;
  7.     scanf("%s",str)                             ;
  8.     int c = 0 , i , m                           ;
  9.     m = strlen(str)                             ;
  10.     for(i = 0 ; i != '\n'; i ++) {
  11.         if(str[i] >= 65 && str[i] <= 90)
  12.             str[i] += 32                        ;
  13.             c ++                                ;
  14.     }
  15.     printf("%s\n", str)                         ;
  16.     printf("c = %d , strlen(s) = %d\n" , c , m) ;
  17.     return 0;
  18. }
复制代码

      这是在我这里的运行情况:
C:\Bin\00.Example\C>g++ -o test test.c

C:\Bin\00.Example\C>test
ABCDEFG
abcdefg
c = 10 , strlen(s) = 7

C:\Bin\00.Example\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 18:53:59 | 显示全部楼层
1809228982 发表于 2019-5-14 15:03
字符串结束的下一个内存地址。

那不就得了。
你对(字符串结束的下一个内存地址)进行free。
C又不是你开发的。你想free就free

https://www.cnblogs.com/wuchanming/p/4440872.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-15 16:55:11 | 显示全部楼层
jackz007 发表于 2019-5-14 15:28
只要用这个代码做一下测试,你就会知道,其实你的操作早就超出了字符串的长度范围,最终是因为 ...

我把for 循环里面的 i != '\n'  换成 i != '\0' 之后,就不行了,大写并没有转换小写。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-15 17:01:41 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-15 23:42 编辑
1809228982 发表于 2019-5-15 16:55
我把for 循环里面的 i != '\n'  换成 i != '\0' 之后,就不行了,大写并没有转换小写。


      以你的悟性和实力,就不必那么自信了,你试过 2 楼的代码了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-16 08:46:27 | 显示全部楼层
jackz007 发表于 2019-5-15 17:01
以你的悟性和实力,就不必那么自信了,你试过 2 楼的代码了吗?

我知道了,是我看错了,不好意思,感谢耐心指点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 10:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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