编程训练(全部用指针实现)
1.输入任意字符串,把所有小写字母换成大写字母
(输入ABcDEfgH 输出ABCDEFGH)
思路:首先想到--->《字母转换大小写的三种方法》、
第一种:加减32法
1.小写转大写:字符数据减32法
输入一个小写字母,输出其对应的大写字母
#include<stdio.h>
int main()
{
char ch;
printf("请输入一个小写字母:\n");
scanf("%c", &ch);
if (ch >= 97 && ch <= 122)//写成ch>='a'&&ch<='z'也可以
{
ch = ch - 32;
printf("其对应的大写字母");
printf("%c", ch);
}
return 0;
}
库函数法:toupper() 头文件<ctype.h> tolower
函数原型:int toupper (int c)
意思就是如果你向toupper函数传输一个小写字母(实际是他的ASCII值)他会返回一个字母对应的大写字母
#include<stdio.h>
int my_toupper(int ch)
{
if (ch >= 97 && ch <= 122)
{
return ch - 32;
}
else
{
return ch;
}
}
int main()
{
char ch = 'a';
ch = my_toupper(ch);
printf("%c", ch);
return 0;
}
2.大写转小写:字符数据加32
#include<stdio.h>
int my_tolower(int ch)
{
if (ch >= 65 && ch <= 90)
{
return ch + 32;
}
else {
return ch;
}
}
int main()
{
char ch = 'A';
ch = my_tolower(ch);
printf("%c", ch);
return 0;
}
位运算法: 按位异或(^相同为0,不同为1)
65 01000001
32 00100000
97 01100001
反之:97^32=65
int my_move(int ch)
{
if (((ch >= 97) && (ch <= 122)) || ((ch >= 65) && (ch <= 90)))
{
return ch ^ 32;
}
else
{
return ch;
}
}
int main()
{
char ch1 = 'a';
ch1 = my_move(ch1);
char ch2 = 'A';
ch2 = my_move(ch2);
char ch3 = 97;
ch3 = my_move(ch3);
char ch4 = 65;
ch4 = my_move(ch4);
char ch5 = 322;
ch5 = my_move(ch5);
printf("%c\n", ch1);
printf("%c\n", ch2);
printf("%c\n", ch3);
printf("%c\n", ch4);
printf("%c\n", ch5);
}
这个方法可以实现:传入大写字符转换成小写字符,传入小写字符转换为大写字符的效果
如果你能够想到以上三种方法:那么这道题目应该迎刃而解
#include <stdio.h>
#include <ctype.h>
int main()
{
char str[100];
scanf("%s", str); // 从标准输入读取字符串,遇到空格或换行符停止
for (int i = 0; str[i] != '\0'; i++)
{
str[i] = toupper(str[i]); // 调用 toupper 函数将小写字母转换为大写字母
}
printf("%s", str); // 输出结果字符串
return 0;
}
在上面的代码中,我们使用 scanf 函数来读取字符串,并使用循环来将字符串中的小写字母转换成
大写字母,最后输出结果字符串。请注意,scanf 在遇到空格或换行符时会停止读取,/因此适用于不含空格的字符串输入。如果需要处理含有空格的字符串,建议使用 fgets 函数。
什么是fgets函数?
char*fgets(char*str,int n,FILE*stream)
参数一:读取出来的数据装在哪里
参数二最大读取量,不要超过参数1的长度
参数三:文件指针 指向标识输入流的FILE对象的指针。Stdin可以用作从标准输入中读取的参数
返回值:就是str的地址
#include <stdio.h>
#include <ctype.h>
int main() {
char str[100];
fgets(str, sizeof(str), stdin); // 从标准输入读取字符串
for (int i = 0; str[i] != '\0'; i++)
{
str[i] = toupper(str[i]); // 调用 toupper 函数将小写字母转换为大写字母
}
printf("%s", str); // 输出结果字符串
return 0;
}
以上代码中使用了 toupper 函数将小写字母转换为大写字母,并使用 fgets 从标准输入中读取字符串。
需要注意的是,该代码目前限制了字符串长度不超过 100 个字符。
在 C 语言中,gets
和 fgets
都可以用来读取字符串,但它们之间存在一些区别。
-
安全性:
gets
函数不会进行输入长度的检查,如果输入的字符串长度超出了目标数组的容量,会导致缓冲区溢出,可能引发安全问题。而fgets
函数可以指定最大读取长度,并进行相应的边界检查,从而更安全。 -
读取方式:
gets
函数会读取整行字符串,包括换行符,但不会将换行符存储在目标数组中。而fgets
函数会读取整行字符串,并将换行符存储在目标数组中(除非输入的字符串达到了数组容量限制)。 -
错误处理:
gets
函数在遇到错误时返回NULL
。而fgets
函数在遇到错误或读到文件尾时返回NULL
。
由于 gets
存在安全性问题,并且没有边界检查功能,在实际开发中一般不推荐使用。相比之下,fgets
更为安全可靠,因为它可以限制输入的最大长度,并且能够处理换行符和错误情况。因此,建议在读取字符串时使用 fgets
函数。