关于使用指针把大写字母变成小写字母的程序。
为什么不可以的呢??#include <stdio.h>
#include <stdlib.h>
int main ()
{
char *str = NULL;
str = (char *)malloc(sizeof(char) * 10);
scanf("%s",str);
while(*str++ != '\n')
{
if(*str >= 65 && *str <= 90)
*str += 32;
}
printf("%s\n", str);
free(str);
return 0;
} 本帖最后由 jackz007 于 2019-5-13 12:23 编辑
scanf() 会把 '\n'、空格、Tab 视为空白分隔字符统统加以滤除,所以,通过 scanf() 输入的字符串不可能包含 '\n' 字符
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char * str = NULL ;
int c ;
str = (char *)malloc(sizeof(char) * 80) ;
scanf("%s" , str) ;
for(c = 0 ; * (str + c) != '\0' ; c ++) if (* (str + c) >= 65 && * (str + c) <= 90) * (str + c) += 32 ; // str 的值不可以修改!!!
printf("%s\n", str) ;
free(str) ;
}
问题1,指针指到最后了,free()出错。
问题2,大小写转换处理(自己改下)
问题3,结束标志就是'\0'
参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char *str = NULL, *tmp = NULL;
str = (char *)malloc(sizeof(char) * 10);
if(str == NULL)
{
exit(1);
}
memset(str, '\0', sizeof(char) * 10);
scanf("%s",str); // gets(str);
tmp = str;
while(*tmp++ != '\0')
{
if(*tmp >= 65 && *tmp <= 90)
*tmp += 32;
}
printf("%s\n", str);
free(str);
return 0;
} jackz007 发表于 2019-5-13 12:05
scanf() 会把 '\n'、空格、Tab 视为空白分隔字符统统加以滤除,所以,通过 scanf() 输入的字符串不可 ...
可是为什么使用数组的时候就可以呢? (只把指针的地方换成数组) ba21 发表于 2019-5-13 12:15
问题1,指针指到最后了,free()出错。
问题2,大小写转换处理(自己改下)
问题3,结束标志就是'\0'
你的这个是不是重点是只用了memset把分配的10个char的内存 初始化为'\0'?而我的问题是不是在字符串的结尾没有'\0'呢?? 1809228982 发表于 2019-5-13 17:53
可是为什么使用数组的时候就可以呢? (只把指针的地方换成数组)
那你举个例子先,让我也开开眼。 1809228982 发表于 2019-5-13 17:57
你的这个是不是重点是只用了memset把分配的10个char的内存 初始化为'\0'?而我的问题是不是在字符串的 ...
拜托学习用点心,问题给你指出了3点,代码也给你上了,你能看不明白?
反问你一下while(*str++ != '\0') 最后str的地址在哪?
不用心看,我觉得再给你多解释也是浪费口水。 jackz007 发表于 2019-5-13 18:06
那你举个例子先,让我也开开眼。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char str;
scanf("%s",str);
for(int i = 0; i != '\n'; i++)
{
if(str >= 65 && str <= 90)
str += 32;
}
printf("%s\n", str);
return 0;
}
ba21 发表于 2019-5-13 19:01
拜托学习用点心,问题给你指出了3点,代码也给你上了,你能看不明白?
反问你一下while(*str++ != '\0') ...
字符串结束的下一个内存地址。 本帖最后由 Croper 于 2019-5-14 15:23 编辑
1809228982 发表于 2019-5-14 14:56
首先,同学,脑袋清醒一点:
for(int i = 0; i != '\n'; i++)
这个翻译过来不就是
for(int i = 0; i != 10; i++)
固定循环10次么
其次,scanf为一个字符串赋值的时候,会自动在字符串结尾加‘\0’,不然程序怎么知道字符串是不是结束了 本帖最后由 jackz007 于 2019-5-14 15:35 编辑
1809228982 发表于 2019-5-14 14:56
只要用这个代码做一下测试,你就会知道,其实你的操作早就超出了字符串的长度范围,最终是因为到达数组边界才不得不停止循环的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char str ;
scanf("%s",str) ;
int c = 0 , i , m ;
m = strlen(str) ;
for(i = 0 ; i != '\n'; i ++) {
if(str >= 65 && str <= 90)
str += 32 ;
c ++ ;
}
printf("%s\n", str) ;
printf("c = %d , strlen(s) = %d\n" , c , m) ;
return 0;
}
这是在我这里的运行情况:
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> 1809228982 发表于 2019-5-14 15:03
字符串结束的下一个内存地址。
那不就得了。
你对(字符串结束的下一个内存地址)进行free。
C又不是你开发的。你想free就free
https://www.cnblogs.com/wuchanming/p/4440872.html jackz007 发表于 2019-5-14 15:28
只要用这个代码做一下测试,你就会知道,其实你的操作早就超出了字符串的长度范围,最终是因为 ...
我把for 循环里面的 i != '\n'换成 i != '\0' 之后,就不行了,大写并没有转换小写。 本帖最后由 jackz007 于 2019-5-15 23:42 编辑
1809228982 发表于 2019-5-15 16:55
我把for 循环里面的 i != '\n'换成 i != '\0' 之后,就不行了,大写并没有转换小写。
以你的悟性和实力,就不必那么自信了,你试过 2 楼的代码了吗? jackz007 发表于 2019-5-15 17:01
以你的悟性和实力,就不必那么自信了,你试过 2 楼的代码了吗?
我知道了,是我看错了,不好意思,感谢耐心指点。
页:
[1]