目录

NO.26十六届蓝桥杯备战字符数组七道练习islowerisuppertolowertoupperstrstrC

NO.26十六届蓝桥杯备战|字符数组七道练习|islower|isupper|tolower|toupper|strstr(C++)

https://i-blog.csdnimg.cn/direct/d223e26bede04dacb7f2a91b582818ac.png

小写字母 - 32 = 大写字母

大写字母 + 32 = 小写字母

#include <bits/stdc++.h>
using namespace std;

const int N = 110;
char a[N] = { 0 };

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;

    int i = 0;
    while (a[i] != '\0')
    { 
        if (a[i] >= 'a' && a[i] <= 'z')
        {
            a[i] -= 32;
        }
        cout << a[i];
        i++;
    }
    cout << endl;
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 110;
char a[N] = { 0 };

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;

	int len = strlen(a);
    int i = 0;
    for (i = 0; i < len; i++)
    { 
        if (a[i] >= 'a' && a[i] <= 'z')
        {
            a[i] -= 32;
        }
    }
    cout << a << endl;
    
    return 0;
}

这⾥再给⼤家介绍两个函数: islower 和 tolower ,需要的头⽂件是 <cctype>

字符分类函数和字符转换函数:https://legacy.cplusplus.com/reference/cctype/

int islower ( int c ); //判断字符是否是⼩写字⺟  
int tolower ( int c ); //转换成⼩写字⺟

islower 是C/C++中提供的⼀个判断字符是否是⼩写字⺟的函数,如果参数 c 是⼩写字⺟,函数返回⼀个⾮0的数字,如果不是⼩写字⺟,函数返回0,其实还有⼀个函数是 isupper ,是判断⼤写字⺟的。

tolower 是C/C++中提供的⼀个将参数 c 从⼤写字⺟转化成⼩写字⺟的函数,通过返回值返回转换后的⼩写字⺟。如果 c 本⾝就是⼩写字⺟,则什么都不发⽣。还有⼀个函数是 toupper ,是⼩写字⺟转换成⼤写的。

#include <iostream>  
#include <cctype>  

using namespace std;  
const int N = 110;  
char s[N];  
int main()  
{  
	cin >> s;
	  
	for(int i = 0; s[i] != '\0'; i++)  
	{  
		if(islower(s[i]))  
		{  
			s[i] = toupper(s[i]);  
		}  
	}  
	cout << s <<endl;  

	return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 265;
char a[N] = {0};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    fgets(a, 265, stdin);  //会一直读到\n,将\n放入到数组末尾,再加上\0
    int i = 0;
    int cnt = 0;
    while (a[i] != '\n')
    {
        if (a[i] >= '0' && a[i] <= '9')
            cnt++;
        i++;        
    }
    cout << cnt << endl;
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 265;
char a[N] = {0};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    scanf("%[^\n]s", a);  //不会读取\n,会放上\0
    int i = 0;
    int cnt = 0;
    while (a[i] != '\0')
    {
        if (a[i] >= '0' && a[i] <= '9')
            cnt++;
        i++;        
    }
    cout << cnt << endl;
    
    return 0;
}

判断⼀个字符是否是数字字符有⼀个函数是 isdigit ,可以直接使⽤。

int isdigit ( int c );

如果参数 c 是数字字符,则返回⾮ 0 的值,如果不是数字字符,则返回 0 。

#include <iostream>  
#include <cctype>  

using namespace std;  
const int N = 266;  
char arr[N];  

int main()  
{  
	//下⾯这种读取⽅式遇到\n就停⽌,不会讲\n存⼊arr,会⾃动在末尾存放\0  
	scanf("%[^\n]s", arr);  
	int i = 0;  
	int c = 0;  
	while (arr[i] != '\0') //这⾥判断是否等于\0,来觉得是否结束  
	{  
		if (isdigit(arr[i]))  
			c++;  
		i++;  
	}  
	cout << c << endl;  
	
	return 0;  
}
#include <bits/stdc++.h>
using namespace std;

const int N = 20;
char a[N];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin >> n;
	while (n--)
	{
		cin >> a;
		if (islower(a[0]))
			a[0] = toupper(a[0]);
		int i = 1;
		while (a[i] != '\0')
		{
			if (isupper(a[i]))
				a[i] = tolower(a[i]);
			i++;
		}
		cout << a << endl;
	}
	

	return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 510;
char a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    double n = 0;
    cin >> n;
    cin >> a;
    int i = 0;
    char t = 0;
    int cnt = 0;
    while (a[i] != '\0')
    {
        cin >> t;
        if (a[i] == t)
            cnt++;
        i++;
    }
    if (cnt * 1.0 / strlen(a) >= n)
        cout << "yes" << endl;
    else
        cout << "no" << endl;

    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 110;
char a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a; //a的末尾是\0
    int i = 0;
    while (a[i+1])
    {
        char tmp = a[i] + a[i+1];        
        cout << tmp;
        i++;
    }
    cout << (char)(a[i] + a[0]) << endl;
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 110;
char a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a; //a的末尾是\0
    int i = 0;
    int len = strlen(a);
    while (a[i])
    {
        char tmp = a[i] + a[(i+1) % len];        
        cout << tmp;
        i++;
    }
    
    return 0;
}
  1. 这类题⽬就是精确的控制下标,防⽌越界,算准下标
  2. cout 在打印数据的时候是需要明确知道打印数据的类型的,⽅法1中 str[i] + str[0] 算的结果直接打印就被编译器当做整数打印了,所以我们做了 (char) 的强制类型转换。
#include <bits/stdc++.h>
using namespace std;

const int N = 25;
char a[N];
char b[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a >> b;
    if (strstr(a, b))
        cout << b << " is substring of " << a << endl;
    else if (strstr(b, a))
        cout << a << " is substring of " << b << endl;
    else
        cout << "No substring" << endl;
    
    return 0;
}

这个题⽬使⽤了 strstr 函数,这个函数需要 <cstring> 的头⽂件。

const char * strstr ( const char * str1, const char * str2 );  

这个函数可以查找str1字符串中str2字符串第⼀次出现的位置,如果能找到就返回第⼀次出现的地址,如果找不到则返回 NULL , NULL 的本质是 0 。

暴力统计

#include <bits/stdc++.h>
using namespace std;

const int N = 1110;
char a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;
    int i = 0;
	while (a[i])
    {
        int cnt = 0;
        int j = 0;
        while (a[j])
        {
            if (a[i] == a[j])
                cnt++;
            j++;        
        }
        if (cnt == 1)
        {
            cout << a[i];
            break;
        }
        i++;
    }
    if (a[i] == 0)
        cout << "no" << endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 1110;
char a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;
    int i = 0;
    int flag = 0;
    while (a[i])
    {
        int cnt = 0;
        int j = 0;
        while (a[j])
        {
            if (a[i] == a[j])
                cnt++;
            j++;        
        }
        if (cnt == 1)
        {
            cout << a[i];
            flag = 1;
            break;
        }
        i++;
    }
    if (flag == 0)
        cout << "no" << endl;
    return 0;
}

哈希

题⽬说字符串中只有⼩写字⺟,⼩写字⺟的ASCII值的范围是:97 122,根据前⾯我们学习的知识,我们知道在C和C++中每个字符都有ASCII值,标准的ASCII码表中有128个字符,ASCII值的范围是0 127.

所以我们创建⼀个128元素的整型数组,下标分别是0~127,下标正好和字符的ASCII值范围对应,那么整型的数组的⼀个元素就为⼀个字符计数就可以。每读取⼀个字符,根据字符的ASCII值将数组中下标为字符ASCII值的元素值+1,相当于统计这个字符出现的次数。

https://i-blog.csdnimg.cn/direct/ed020f96134c47b5a08bba74fe3b0e47.png

#include <bits/stdc++.h>
using namespace std;

const int N = 1110;
char a[N];
int n[128];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;
    int i = 0;
    while (a[i])
    {
        n[a[i]]++;
        i++;        
    }
    i = 0;
    while (a[i])
    {
        if(n[a[i]] == 1)
        {
            cout << a[i] << endl;
            break;
        }
        i++;
    }
    if (a[i] == 0)
        cout << "no" << endl;
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 1110;
char a[N];
int n[26];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;
    int i = 0;
    while (a[i])
    {
        n[a[i] - 'a']++;
        i++;        
    }
    i = 0;
    while (a[i])
    {
        if(n[a[i] - 'a'] == 1)
        {
            cout << a[i] << endl;
            break;
        }
        i++;
    }
    if (a[i] == 0)
        cout << "no" << endl;
    
    return 0;
}