请c语言高手看看下面这个程序哪里出错了,编译后怎么有一个警告

来源:百度知道 编辑:UC知道 时间:2024/05/29 15:31:31
/*输入n以及小于n个字符的字符串,将字符串中所有小写字母改为相应的大写字母后,输出该字符串。*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int i,n;
char *str;
printf("输入n并输入小于n个字符的字符串:\n");
scanf("%d",&n);
str=(char*)malloc(n*sizeof(char));
gets(str);
for(i=0;i<strlen(str);i++)
{
if(str[i]>='a'&& str[i]<='z')
str[i]=str[i]-('a'-'A');
}
puts(str);
}

问题在这儿:
strlen返回值的类型为unsigned int型的,
而你的代码里i为int型的,
所以编译就会产生一个隐式的强制类型转换的warning,
这么改就行了:
for(i=0;i<strlen(str);i++)
改为:
for(i=0;i<(int)strlen(str);i++)

但你的代码还有一个问题:
就是在gets(str); 前没有将键盘缓冲区清空,所以有可能会造成gets(str)将上次用户输入n值时最后输入的回车,当作本次输入的字符串给读取了,
所以还要这么改一下:
str=(char*)malloc(n*sizeof(char));
fflush(stdin);//加上强制键盘缓冲区清空处理
gets(str);

所以完整的改过以后的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int i,n;
char *str;
printf("输入n并输入小于n个字符的字符串:\n");
scanf("%d",&n);
str=(char*)malloc(n*sizeof(char));
fflush(stdin);//
gets(str);
for(i=0;i<(int)strlen(str);i++)
{
if(str[i]>='a'&& str[i]<='z')
str[i]=str[i]-('a'-'A');
}
puts(str);
}

没有警告啊,也能得到正确答案。

什么警告?看不出有什么问题啊