C语言指针刷题

编程训练(全部用指针实现)
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 都可以用来读取字符串,但它们之间存在一些区别。

  1. 安全性:gets 函数不会进行输入长度的检查,如果输入的字符串长度超出了目标数组的容量,会导致缓冲区溢出,可能引发安全问题。而 fgets 函数可以指定最大读取长度,并进行相应的边界检查,从而更安全。

  2. 读取方式:gets 函数会读取整行字符串,包括换行符,但不会将换行符存储在目标数组中。而 fgets 函数会读取整行字符串,并将换行符存储在目标数组中(除非输入的字符串达到了数组容量限制)。

  3. 错误处理:gets 函数在遇到错误时返回 NULL。而 fgets 函数在遇到错误或读到文件尾时返回 NULL

由于 gets 存在安全性问题,并且没有边界检查功能,在实际开发中一般不推荐使用。相比之下,fgets 更为安全可靠,因为它可以限制输入的最大长度,并且能够处理换行符和错误情况。因此,建议在读取字符串时使用 fgets 函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值