去字符串中的重复字符与空格
dele函数的功能:对给定的字符串,去掉重复的字符与字符串中的空格后,按照字符ASCII码顺序从小到大排序后输出。
输入样例:
abcd efg abc fH 3 2 1
输出样例:
123Habcdefg
测试程序样例:
#include<stdio.h>
#include"string.h"
void dele(char arr[]);
int main(void)
{
char strA[81];
gets(strA);
dele(strA);
puts(strA);
return 0;
}
/* 请在这里填写答案 */
AC代码:
void dele(char arr[]){
int m[150]={0};
for (int i = 0; i < strlen(arr); i++){
if (((int)arr[i]>=48&&(int)arr[i]<=57) || ((int)arr[i]>=97&&(int)arr[i]<=122) || ((int)arr[i]>=65&&(int)arr[i]<=90)){
m[(int)arr[i]]=1;
}
}
int num=0;
for (int i = 48; i<=122; i++){
if (m[i] == 1){
arr[num++]=(char)i;
}
}
arr[num] ='\0';
}
这是一种比较简单的思路,即去重又排序,暴力的话肯定很麻烦,主要考的是思路的转化。
用到int型和char型的转化,在一开始得知道数字和字母的ASCII码是多少,所以我们可以用以下代码知道大致范围:
#include<stdio.h>
#include"string.h"
int main(void)
{
char a[6] = {'0','9', 'a','z', 'A','Z'};
for (int i= 0; i<6; i++){
printf("%d ", a[i]);
}
return 0;
}
就可以在判断语句中来筛别需要的数,最后注意一些细节,比如m数组的初始化,和arr组最后结束要加一个“\0”才能算是一个字符串。
输入单词并排序输出
本题要求通过input()函数实现输入若干个单词(每单词的长度不超过20,单词的最大数目不超过10)。输入过程中遇到单词*END* 则提前结束输入(*END*不作为后面排序的单词),或单词数目达到10个也结束。然后调用函数paixu(),对这若干个单词按字典顺序进行排序,最后调用函数printArr()输出排序后的单词,输出的单词之间以空格进行分隔,最后一个单词后面没有空格。
输入样例:
China Britain America Japan Egypt *END*
输出样例:
After sorted:
America Britain China Egypt Japan
测试程序样例:
#include<stdio.h>
#include<string.h>
int input(char ar2[][21]);
void paixu(char ar2[][21], int n);
void printArr(char ar2[][21], int n);
int main(void)
{
char arr[10][21]={0};
int n;
n=input(arr);
paixu(arr,n);
printArr(arr,n);
return 0;
}
/* 请在这里填写答案 */
AC代码:
int input(char ar2[][21]){
int num = 0;
char end[6] = "*END*", str[21];
while (num < 10){
scanf("%s", str);
if (strcmp(str, end) == 0) break;
else strcpy(ar2[num++], str);
}
return num;
}
// 其中函数的返回值等于输入的有效单词的数目。
void paixu(char ar2[][21], int n){
char temp[21];
for (int i = 0; i<n; i++){
for (int j = 0; j < n-i-1; j++){
if (strcmp(ar2[j], ar2[j+1]) > 0){
strcpy(temp, ar2[j]);
strcpy(ar2[j], ar2[j+1]);
strcpy(ar2[j+1], temp);
}
}
}
}
// 其中函数完成对ar2数组中的n个字符串进行排序。
void printArr(char ar2[][21], int n){
if (n == 0){
printf("NO WORD");
return ;
}
printf("After sorted:\n");
for (int i = 0; i<n; i++){
if (i == 0) printf("%s", ar2[i]);
else printf(" %s", ar2[i]);
}
}
思路:主要考了字符串的一些函数的使用和排序(这里用的是冒泡排序),注意一下strtcmp是按字典序(ASCII)码比较的,str1的字典序大于str2返回正数。其次值得注意的是scanf的结束标准为空格字符(包括空格、制表符(tab)和换行符(newline))时结束,而gets
函数确实用于从标准输入(通常是键盘)读取一行文本,直到遇到换行符(\n
)或文件结束符(EOF)为止。
输入多个单词,统计以指定字母开头的单词个数
先输入一个含有多个单词的字符串,然后再输入一个字母,然后调用函数getWordNum统计该行字符中以指定字母开始的单词的个数(不区分大小写)。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入样例:
af Adf Dad abdde
a
输出样例:
3
测试程序样例:
#include<stdio.h>
int getWordNum(char ar1[],char ch) ;
int main()
{
char string[81],c,n;
gets(string);
c=getchar();
n=getWordNum(string,c);
printf("%d",n);
return 0;
}
/* 请在这里填写答案 */
AC代码:
int getWordNum(char ar1[],char ch) {
int num = 0, cnt = 0;
ch = tolower(ch);
for (int i = 0; i < strlen(ar1); i++){
if (ar1[i] == ' ') num = 0;
else {
if (num == 0){
num++;
char temp = tolower(ar1[i]);
if (temp == ch) cnt++;
}
else num++;
}
}
return cnt;
}
主要考字符串转化成小写字母的函数tolower()。
蛇年谐音梗
2025 年是蛇年,大家都在用“蛇”造好玩的谐音梗,比如“蛇我其谁,年年有为”,还有略转音的如“蛇全蛇美”、“蛇来运转”等…… 喜欢编程的你也想造梗,于是直接写个程序,从一万句话里把带了汉语拼音 she
和 shi
的句子都自动挑出来备选。
输出格式:
按照输入的顺序扫描每句话,如果句子中带有 she
或是 shi
(不区分大小写),则在一行中原样输出这句话。题目保证至少有一句输出。
输入样例:
4
she wo qi shui nian nian you wei
zhe ju hua li mei you xie yin zi
shi quan shi mei
SHILaiYunZhuan
输出样例:
she wo qi shui nian nian you wei
shi quan shi mei
SHILaiYunZhuan
AC代码:
#include <bits/stdc++.h>
using namespace std;
void toLowercase(std::string& str) {
std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return std::tolower(c); });
}
void solve()
{
int n, m, k;
string s;
cin >> n;
cin.ignore();
for (int i = 1; i<=n; i++){
getline(cin, s);
string str = s;
toLowercase(s);
if (s.find("she") != string::npos || s.find("shi") != string::npos){
cout << str << endl;
}
}
}
signed main()
{
solve();
}
这道题只要还是考察了字符串的熟练程度。这里强调几个值得注意的地方。
-
getline
函数在读取字符串时,如果在cin >> n;
之后直接使用,会导致问题。原因是在cin >> n;
之后,输入缓冲区中可能残留换行符,这会导致getline
读取到一个空字符串。为了解决这个问题,可以在调用getline
之前,使用cin.ignore()
来忽略掉换行符,或者在读取整数n
之后使用cin.getline()
来代替cin >> n;
和getline()
。 -
其次是字符串的小写化。
-
find函数的使用,
find
函数返回的是子字符串的位置,如果找不到子字符串,返回的是string::npos
,而不是布尔值。因此,检查应该改成if (s.find("she") != string::npos || s.find("shi") != string::npos)
。
字符串排序
从键盘上输入N个字符串(约定:每个字符串中字符数≤80字节),对其进行升序排序并输出。
输入样例:
hello
My
Friend
Are you ok?
help me!
输出样例:
Are you ok?
Friend
My
hello
help me!
测试程序样例:
#include<stdio.h>
#include<string.h>
#define N 5
void sort_Str(char **p);
int main(void)
{
int i;
char *pstr[N], str[N][81];
for (i=0; i<N; i++)
{
pstr[i] = str[i];
}
for (i=0; i<N; i++)
{
gets(pstr[i]);
}
sort_Str(pstr);
for (i=0; i<N; i++)
{
printf("%s\n", pstr[i]);
}
return 0;
}
/* 请在这里填写答案 */
AC代码:
void sort_Str(char **p){
for (int i = 0; i<N-1; i++){
for (int j = 0; j<N-1-i; j++){
if (strcmp(p[j], p[j+1]) > 0){
char *temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
}
单词长度
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.
结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's
算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.
不计算在内。
输入样例:
It's great to see you here.
输出样例:
4 5 2 3 3 4
AC代码:
#include<stdio.h>
#include<string.h>
int main(void)
{
char ch;
int num = 0, cnt = 0;
int flag = -1;
scanf("%c", &ch);
while (ch != '.'){
if (ch == ' '){
if (num != 0){
if (cnt == 0){
printf("%d", num);
}
else printf(" %d", num);
cnt++;
}
num = 0;
}
else num++;
scanf("%c", &ch);
}
if (num != 0){
if (cnt == 0){
printf("%d", num);
}
else printf(" %d", num);
}
return 0;
}
自我认为是在输出格式上比较复杂,卡了半天,讨论了很多地方,如果有简单的方法欢迎讨论。
输出指定星期的前三个字母
补充以下程序中空白部分的代码,以实现:输入一个[1,7]间的整数x,输出两次星期x的英文单词的前三个字母。第一次输出用指向行的指针变量,第二次输出用指向元素的指针变量。
例如:输入1,输出两次Mon;输入6,输出两次Sat。
AC代码:
#include <stdio.h>
int main()
{
char a[7][10]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
char *p; //定义指向元素的指针变量p
char (*q)[10]; //定义指向行的指针变量q
int i,x;
scanf("%d",&x);
q=a+x-1;
for (int i = 0; i<3; i++){
printf("%c", (*q)[i]);
}
printf("\n");
p = a[x-1];
for (int i = 0; i<3; i++){
printf("%c", *(p+i));
}
return 0;
}