
👨💻 博主正在持续更新编程习题中。 ❤️ 如果你觉得内容还不错,请多多点赞。 ⭐️ 如果你觉得对你有帮助,请多多收藏。(防止以后找不到了) 👨👩👧👦如果你想阅读更多的
编程习题讲解和C++的语法讲解,请多多关注博主。

往期练习题回顾:链接: P5733 【深基6.例1】自动修正 P1914 小书童——凯撒密码 P1125 [NOIP2008 提高组] 笨小猴

#include <iostream>
#include <cstring> //使用memset 和 strlen
#include <cstdio> //使用sscanf 和 sprintf
using namespace std;
int main()
{
char operatorChar;
int num1, num2;
char input[10], resultString[100];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> input;
//如果输入的第一个是字符,即运算符
if (input[0] >= 'a' && input[0] <= 'z')
{
operatorChar = input[0];
cin >> num1 >> num2;
}
//如果输入的第一个是数字,即操作数
else
{
sscanf(input, "%d", &num1);
cin >> num2;
}
memset(resultString, 0, sizeof(resultString));//清空原有的字符串,防止长度判断错误
switch (operatorChar)
{
case 'a':
sprintf(resultString, "%d+%d=%d", num1, num2, num1 + num2);
break;
case 'b':
sprintf(resultString, "%d-%d=%d", num1, num2, num1 - num2);
break;
case 'c':
sprintf(resultString, "%d*%d=%d", num1, num2, num1 * num2);
break;
}
cout << resultString << endl << strlen(resultString) << endl;
}
return 0;
}交互过程: 4 a 1 2 1+2=3 5 3 4 3+4=7 5 b 5 6 5-6=-1 6 c 7 8 7*8=56 6
cin >> input;
//如果输入的第一个是字符,即运算符
if (input[0] >= 'a' && input[0] <= 'z')
{
operatorChar = input[0];
cin >> num1 >> num2;
}
//如果输入的第一个是数字,即操作数
else
{
sscanf(input, "%d", &num1);
cin >> num2;
}int num1;
int num2;
sprintf(resultString, "%d+%d=%d", num1, num2, num1 + num2);
sprintf(resultString, "%d-%d=%d", num1, num2, num1 - num2);
sprintf(resultString, "%d*%d=%d", num1, num2, num1 * num2);
函数的介绍sscanf:用于从字符串中读取格式化的数据。
scanf 函数的字符串版本。 scanf 是从标准输入(通常是键盘)读取数据。sscanf 是从一个指定的字符串中读取数据。sscanf 用于读取字符串到字符数组中,需要确保数组有足够的空间来存储读取的数据,包括终止的空字符。函数的原型
int sscanf(const char *str, const char *format, ...);str:是要读取数据的字符串。
format:是格式控制字符串。
str 中解析这些参数。scanf 使用的格式字符串非常相似。...:是可变参数列表。
函数的使用
读取整数
int num;
char str[] = "123";
sscanf(str, "%d", &num);%d:用于读取一个十进制整数。 sscanf函数会将字符串str中的数字123解析出来。num中。读取浮点数
float f;
char str[] = "3.14";
sscanf(str, "%f", &f);%f:用于读取一个浮点数。 sscanf函数会将字符串str中的3.14解析为浮点数。f中。读取字符串
char sub_str[10];
char str[] = "Hello World";
sscanf(str, "%s", sub_str);%s:用于读取一个字符串。 sscanf函数会将字符串str中的第一个单词Hello读取出来,sub_str中。%s遇到空格就会停止读取。读取多个数据
int a, b;
char str[] = "10 20";
int n = sscanf(str, "%d %d", &a, &b);会按照顺序将str中的10读取到a中,20读取到b中。函数的返回值
sscanf函数返回:成功读取并赋值的参数的个数。
int a, b;
char str[] = "10 20";
int n = sscanf(str, "%d %d", &a, &b);n的值为2,因为成功读取并赋值了两个变量。str是"10x",n的值可能为1%d成功读取了10x时第二个%d无法正确读取。
函数的介绍sprintf:用于将格式化的数据写入字符串。
sprintf 函数的字符串版本。 printf 是将格式化的输出发送到标准输出(通常是屏幕)sprintf 是将输出发送到一个字符串缓冲区。函数的原型
int sprintf(char *str, const char *format, ...);str:是一个字符数组的指针,即目标字符串缓冲区。 sprintf 会将格式化的输出写入这个缓冲区。format:是格式控制字符串。 printf 使用的格式字符串非常相似。...:是可变参数列表。 函数的使用
格式化整数
char buffer[50];
int num = 123;
sprintf(buffer, "The number is %d", num);%d:用于格式化整数。 sprintf函数会将num的值(即 123)按照指定的格式写入到buffer字符串中。buffer的内容变为The number is 123格式化浮点数
char buffer[50];
float f = 3.14;
sprintf(buffer, "The float number is %f", f);%f:用于格式化浮点数。 sprintf函数会将f的值(即3.14)按照指定的格式写入到buffer字符串中。buffer的内容变为The float number is 3.140000格式化字符串
char buffer[50];
char str[] = "Hello";
sprintf(buffer, "The string is %s", str);%s:用于格式化字符串。 sprintf函数会将str的内容(Hello)按照指定的格式写入到buffer字符串中。buffer的内容变为The string is Hello。组合多种数据类型
char buffer[100];
int a = 10;
float b = 2.5;
sprintf(buffer, "Integer: %d, Float: %f", a, b);sprintf函数会将a和b的值按照指定格式写入到buffer字符串中。buffer的内容变为Integer: 10, Float: 2.500000。函数的返回值
sprintf函数返回:成功写入到目标字符串中的字符数(不包括字符串结束符\0)。
char buffer[50];
int num = 123;
int n = sprintf(buffer, "The number is %d", num);n的值为17(因为The number is 123这个字符串的长度为 17)。
函数的介绍memset:将一段内存空间的每个字节都设置为指定的值。
<cstring> 头文件中。
函数的原型
void *memset(void *ptr, int value, size_t num);ptr:是指向要操作的内存块的起始地址的指针。value:是要设置的字节值。 int,但是实际这个值会被转换为unsigned char类型后填充到内存块中。num:要设置的字节数。 ptr开始的内存长度。函数的使用
完全初始化数组
char buffer[100];
memset(buffer, 'A', sizeof(buffer));buffer数组的 100 个字节都设置为字符A,实际上就是将整个数组的内容都初始化为A。部分初始化数组
int largeArr[1000];
memset(largeArr, 0, 100);int占 4 个字节,那么就是前 25 个元素)memset(largeArr, 0, 100);。初始化结构体
struct Student {
char name[20];
int age;
float score;
};
Student stu;
memset(&stu, 0, sizeof(Student));stu的所有成员的内存都初始化为 0name数组清零,age设为 0,score设为 0.0#include <iostream>
#include <string>
#include <cctype> // 使用 isalpha
#include <cstdlib> // 使用 atoi
using namespace std;
int main() {
char operatorChar;
int num1, num2;
string input, resultString;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> input;
if (isalpha(input[0]))
{
operatorChar = input[0];
cin >> num1 >> num2;
}
else
{
num1 = atoi(input);
cin >> num2;
}
switch (operatorChar)
{
case 'a':
resultString = to_string(num1) + "+" + to_string(num2) + "=" + to_string(num1 + num2);
break;
case 'b':
resultString = to_string(num1) + "-" + to_string(num2) + "=" + to_string(num1 - num2);
break;
case 'c':
resultString = to_string(num1) + "*" + to_string(num2) + "=" + to_string(num1 * num2);
break;
}
cout << resultString << endl << resultString.size() << endl;
}
return 0;
}交互过程: 4 a 1 2 1+2=3 5 3 4 3+4=7 5 b 5 6 5-6=-1 6 c 7 8 7*8=56 6
cin >> input;
//如果输入的第一个是字符,即运算符
if (isalpha(input[0]))
{
operatorChar = input[0];
cin >> num1 >> num2;
}
//如果输入的第一个是数字,即操作数
else
{
num1 = atoi(input);
cin >> num2;
}int num1;
int num2;
resultString = to_string(num1) + "-" + to_string(num2) + "=" + to_string(num1 - num2);
resultString = to_string(num1) + "-" + to_string(num2) + "=" + to_string(num1 - num2);
resultString = to_string(num1) + "*" + to_string(num2) + "=" + to_string(num1 * num2);
函数的介绍atoi:用于将字符串(const char*类型)转换为整数(int类型)。
<cstdlib>头文件中声明。'\0'结尾的字符串转换为对应的整数值。函数的原型
int atoi(const char *str);str:指向要转换的字符串的指针。
是有效的数字字符(包括正负号)->atoi函数会跳过前面的空白字符(如空格、制表符、换行符等)
"123abc",atoi函数会将"123"部分转换为整数,而忽略"abc"部分。不是有效的数字字符->atoi函数返回 0
"abc",atoi会返回 0。空串->atoi函数返回 0
"",atoi会返回 0。'-'开头**->转换后的整数为负数;如果以'+'开头->**转换后的整数为正数。
函数的介绍to_string:用于将数值类型(如整数、浮点数等)转换为string类型。
<string> 中。数字和字符串拼接、或者将数字以字符串形式存储或输出等场景中非常有用。
to_string函数可以处理以下几种常见的数据类型:
int, long, long long, unsigned int, unsigned long, unsigned long long 等)。float, double, long double)。函数的原型
函数原型根据不同的参数类型有所不同:
对于整数类型:
string to_string(int val);对于长整数类型:
string to_string(long val);对于无符号整数类型:
string to_string(unsigned int val);函数的使用
这里简单列举几个to_string函数的使用的实例:
整数类型(int)
int num = 123;
string str = to_string(num);123转换为字符串形式,转换后的str内容为"123"。无符号整数类型(unsigned int)
unsigned int unum = 456;
string ustr = to_string(unum);456转换为字符串,转换后的ustr的内容为"456"。长整数类型(long)和无符号长整数类型(unsigned long)
long lnum = 789L;
std::string lstr = to_string(lnum);
unsigned long ulnum = 1011UL;
string ulstr = to_string(ulnum);789L和无符号长整数1011UL转换为字符串,lstr的内容为"789",ulstr的内容为"1011"。浮点数类型(float和double)
float fnum = 3.14f;
string fstr = to_string(fnum);
double dnum = 2.71828;
string dstr = to_string(dnum);3.14f和2.71828转换为字符串,fstr的内容可能是"3.140000"(具体的小数位数可能因编译器和系统设置等因素而有所不同)dstr的内容也类似,如"2.718280"。其他:
在进行数字和字符串拼接操作时,to_string函数提供了便捷的方式。
//可以将多个数字和字符串拼接在一起
string result = "The number is " + to_string(7) + " and the float is " + to_string(3.14);#include<iostream>
#include<cstdio> //使用sscanf 和 sprintf 和 fgets
#include<cstring> //使用memset 和 strlen
using namespace std;
int main()
{
int x[100] = { 0 }, y[100] = { 0 };
char operatorChar[100] = { 0 };
char input[100], resultString[100];
int n;
cin >> n;
getchar();
for (int i = 0; i < n; i++)
{
memset(input, 0, sizeof(input));
fgets(input, sizeof(input), stdin);
// 去除换行符(因为 fgets 会把换行符也读进来,可能不符合后续处理逻辑需求)
size_t len = strlen(input);
if (len > 0 && input[len - 1] == '\n')
{
input[len - 1] = '\0';
}
//如果输入的第一个是字符,即运算符
if (input[0] >= 'a' && input[0] <= 'c')
{
operatorChar[i] = input[0];
sscanf(input, "%*s %d %d", &x[i], &y[i]);
}
//如果输入的第一个是数字,即操作数
else
{
operatorChar[i] = operatorChar[i - 1];
sscanf(input, "%d %d", &x[i], &y[i]);
}
}
for (int i = 0; i < n; i++)
{
memset(resultString, 0, sizeof(resultString));
if (operatorChar[i] == 'a')
{
sprintf(resultString, "%d+%d=%d", x[i], y[i], x[i] + y[i]);
cout << resultString << endl << strlen(resultString) << endl;
}
if (operatorChar[i] == 'b')
{
sprintf(resultString, "%d-%d=%d", x[i], y[i], x[i] - y[i]);
cout << resultString << endl << strlen(resultString) << endl;
}
if (operatorChar[i] == 'c')
{
sprintf(resultString, "%d*%d=%d", x[i], y[i], x[i] * y[i]);
cout << resultString << endl << strlen(resultString) << endl;
}
}
return 0;
}交互过程: 4 a 1 2 3 4 b 5 6 c 7 8 1+2=3 5 3+4=7 5 5-6=-1 6 7*8=56 6
fgets(input, sizeof(input), stdin);
// 去除换行符(因为 fgets 会把换行符也读进来,可能不符合后续处理逻辑需求)
size_t len = strlen(input);
if (len > 0 && input[len - 1] == '\n')
{
input[len - 1] = '\0';
}//如果输入的第一个是字符,即运算符
if (input[0] >= 'a' && input[0] <= 'c')
{
operatorChar[i] = input[0];
sscanf(input, "%*s %d %d", &x[i], &y[i]);
}
//如果输入的第一个是数字,即操作数
else
{
operatorChar[i] = operatorChar[i - 1];
sscanf(input, "%d %d", &x[i], &y[i]);
}
函数的介绍:fgets:用于从指定的输入流(通常是文件或标准输入)读取一行字符串,并将它们存储到字符数组中。
n - 1个字符、遇到换行符\n或者到达文件末尾(EOF)为止。<cstdio> 头文件中。函数的原型:
char* fgets(char* str, int n, FILE* stream);str:是一个指向字符数组的指针。 n:是要读取的最大字符数。 \0,因此实际能够存储的最大字符数为 n-1。stream:是一个指向 FILE 对象的指针,表示输入流。 stdin(标准输入)来从键盘读取数据,也可以是通过fopen函数打开的文件流。函数的使用:
从标准输入读取一行字符串:
#include <cstdio>
#define MAX_LENGTH 100
int main()
{
char buffer[MAX_LENGTH];
// 从标准输入读取一行字符串
fgets(buffer, MAX_LENGTH, stdin);
printf("你输入的是:%s", buffer);
return 0;
}从文件读取一行字符串:
#include <cstdio>
#define MAX_LENGTH 100
int main()
{
char buffer[MAX_LENGTH];
FILE* fp = fopen("test.txt", "r");
if (fp == NULL)
{
perror("打开文件失败");
return 1;
}
// 从文件读取一行数据
fgets(buffer, MAX_LENGTH, fp);
printf("从文件读取的是:%s", buffer);
fclose(fp);
return 0;
}这段代码首先尝试打开一个名为test.txt的文件(以只读方式r)
perror函数输出错误信息并返回错误码。fgets函数从文件中读取一行数据(最多读取MAX_LENGTH - 1个字符),然后输出读取到的内容。
函数的返回值:
fgets函数返回str,也就是指向存储读取内容的字符数组的指针。NULL。fgets也会返回str,不过存储在str中的内容可能不完整。sscanf(input, "%*s %d %d", &x[i], &y[i]);%*s:这是一个格式说明符,其中 %s 表示匹配一个字符串。
* 起到了抑制赋值的作用,意思是按照字符串格式匹配相应内容,但不把匹配到>的内容赋值给任何变量。