首页 > 试题广场 >

计算某字符出现次数

[编程题]计算某字符出现次数
  • 热度指数:1366415 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)

数据范围:

输入描述:

第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。



输出描述:

输出输入字符串中含有该字符的个数。(不区分大小写字母)

示例1

输入

ABCabc
A

输出

2
推荐
import java.util.*;
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        String all="";
        String one="";
        char[] ac;
        char temp;
        int num=0;
        while(s.hasNext())
        {
            //s.toUpperCase(),String 转化为大写
            //s.toLowerCase(),String 转化为小写
            //String字符转换,s.toCharArray()与s.charAt(index)
            //char字符转换,String.valueOf(c)转化为String
        	all=s.nextLine();
            one=s.nextLine();
            //存放原来所有的
            ac=all.toCharArray();
            //存放要的字符
            //temp=one.charAt(0);
            for(int i=0;i<ac.length;i++)
            {
            	if(one.equalsIgnoreCase(String.valueOf(ac[i])))    
                    num++;
            }
            System.out.println(num);
        }
        
    }
    
}

编辑于 2017-03-04 16:05:10 回复(45)
很逆天,系统给的案例,输入1,我的ASCII值是57,但是自测输入时又没问题。。。    :( , 12/13正确率
#include <stdio.h>
#include <string.h>
int main() {
    char k[1000];
    char x;
    int m=0;
    if(fgets(k,sizeof(k), stdin)!=NULL)
    {

    }
    int len = strlen(k);
    scanf("%c",&x);
    int num = (int)x;
    for(int i=0;i<len;i++)
    {
        if(num>=65 && num<=90)
        {
                if( (int)k[i] == num || ((int)k[i]-32) == num)
            {
                m++;
            }
        }
        else if(num>=97 && num<=122)
        {
            if( (int)k[i] == num || num == ((int)k[i]+32))
            {
                m++;
            }
        }
        else if(num>=48 && num <=57)
        {
            if( (int)k[i] == num)
            {
                m++;
            }
        }
    }
    printf("%d",m);
    return 0;
}
发表于 2024-11-20 15:11:46 回复(1)
死去的记忆开始攻击我,注意下scanf的读入配置比较重要,其他的大小写转换、查重都还好吧
#include <stdio.h>
#include <string.h>

int charToAscii(char ch) {
    return (int)ch;
}

int main() {
    int len, count[256]={0}, ch_ascii;
    char str[1000],ch,c;
    scanf("%[^\n] %c", str, &ch);
    if(ch >= 'A' && ch <= 'Z'){
        ch += 32;
    }

    len = strlen(str);
    ch_ascii = charToAscii(ch);

    for(int i=0;i<len;i++){
        
        c = str[i];
        if (c >= 'A' && c <= 'Z'){
            c += 32;
        }
        str[i] = c;
        count[str[i]]++;
    }
    printf("%d",count[ch_ascii]);



    return 0;
}

发表于 2024-10-23 22:08:04 回复(0)
#include <stdio.h>
#include "string.h"
int main() {
    char str[1000];
    char checkchar;
    char count= 0;

    scanf("%[^\n]\n",str);
    scanf("%c",&checkchar);
    checkchar &=0xdf;

    for(int i = 0; i < strlen(str); i++)
        if(((str[i])&0xdf) == checkchar)
           count++;

    printf("%d",count);
   
    return 0;
}
发表于 2024-10-18 13:10:17 回复(0)
思路是先将需要比较的单个字符转化为大写,然后再将整个字符串的所有字母转换为大写,最后再比较

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char str[1000] = {0};
    char ch;
    char ch2;
    int cnt = 0;
    int i = 0;

    scanf("%[^\n]\n", str);
    ch = getchar();
    //scanf("%c\n", &ch);

    ch2 = toupper(ch);

    for (i = 0; i < strlen(str); i++) 
    {
        if (str[i] == ch2 + 32)
        {
            str[i] = toupper(str[i]);
        }
    }

    for (i = 0; i < strlen(str); i++) 
    {
        if (ch2 == str[i])
        {
            cnt++;
        }
    }

    printf("%d", cnt);
    return 0;
}


发表于 2024-09-29 10:49:46 回复(0)
/*
完全通过用例的一个程序参考,后面详细解释了最后一个用例没过的原因
*/
#include <stdio.h>
#include<string.h>

const int length=1000;

typedef struct{
    char s[1000];//1000即length值,如果修改上面length,这里也一定要修改 
    char c;
}SC;

int main() {
    int i=0,num=0;
    SC str=(SC){{'\0',},'\0'};
    scanf("%[^\n]\n%c",str.s,&str.c);
    if(('0'<=str.c)&&(str.c<='9'))
        {
            for(i=0;(i<length)&&(i<strlen(str.s));i++)
/*这里的i<length一定要写,才能把最后一个也通过,或者其他正确逻辑*/
            if(str.s[i]==str.c)
                {
                    num++;
                }
        }
    else
        {
            for(i=0;i<strlen(str.s);i++)
            if((str.s[i]==str.c)||
                (str.s[i]==str.c-'A'+'a')||
                (str.s[i]==str.c-'a'+'A'))
                {
                    num++;
                }
        }
    printf("%d",num);

    return 0;
}
/*
至于通不过最后一个用例的情况,我猜大家多半是因为“数组被填满了的缘故”。

如果通过某些方式获得了最后一次用例输入的输入值的话,你就会发现它刚好给了
1000个字符,而一般我们所定义的字符数组就是刚好1000个空间,例如上面“char
 s[1000]”。我们知道,当一个字符串在输入的时候,函数会自动在末尾加上'\0'
来表示这个字符串结束。但是当我们刚好输入1000个字符,沾满了1000个空间,那么
它的结束标志'\0'就无处安放而被舍弃了。 

所以当我们尝试去获取这个1000个字符串的长度时(通过遍历,通过strlen等),我
们无法找到正确的'\0'去获得正确的长度,所以,我们的i会++直至等于1000这个值,
但是仍然继续进入了循环体。 

你可能会想,s[1000]是无意义的,s[999]才是这个数组的最后一个单元。但是就巧合
在机器把你回车之后所输入的那个需要检索的字符(例如最后用例中所输入的'1'),
也误以为是s数组里的成员了(内存里相邻排列),所以导致又被判断了一次,而输出
了多一个的值。也就是“检查数”把自己也检查了一遍。 
*/ 
发表于 2024-08-06 01:52:15 回复(0)
差一组用例
#include <stdio.h>
#include <string.h>
void countL(char ch[],char a){
    int i = 0;
    int count = 0;
    for(i = 0;i < strlen(ch);i++){
        if(ch[i] == a || ch[i] -32 == a || ch[i] +32 == a)
            count++;
       
    }
    printf("%d",count);
}
int main() {
    char ch[1002];
    gets(ch);
    char a;
    scanf("%c",&a);
    countL(ch,a);
}
发表于 2024-07-06 21:02:55 回复(0)
#include "stdio.h"
int main(){
    char ch;
    char str[1000];
    int count=0,length=0;
    ch=getchar();
    while(ch!='\n'){
        str[length++]=ch;
        ch=getchar();
    }
    scanf("%c",&ch);
    for(int i=0;i<length;i++){
        if(str[i]>='A'&&str[i]<='Z'&&str[i]==ch-32) count++;
        else if(str[i]>='a'&&str[i]<='z'&&str[i]==ch+32) count++;
        else if(str[i]==ch) count++;
    }
    printf("%d",count);
    return 0;
}
#include "stdio.h"
int main(){
    char ch;
    char str[1000];
    int count=0,length=0;
    ch=getchar();
    while(ch!='\n'){
        str[length++]=ch;
        ch=getchar();
    }
    scanf("%c",&ch);
    for(int i=0;i<length;i++){
        if(str[i]>='A'&&str[i]<='Z'&&str[i]==ch-32) count++;
        else if(str[i]>='a'&&str[i]<='z'&&str[i]==ch+32) count++;
        else if(str[i]==ch) count++;
    }
    printf("%d",count);
    return 0;
}


发表于 2024-06-07 18:37:07 回复(0)
#include <stdio.h>
#include <string.h>
#include <ctype.h> 
#define MAXLEN 1000

int num(char* str, char a){
    int count = 0;
    int len = strlen(str);
    for(int i = 0;i < len;i++){
        if(tolower(a) == tolower(str[i])) count++; 
    }
    return count;
}


int main() {
    char str[MAXLEN];
    char a;
    fgets(str,MAXLEN,stdin);
    scanf("%c", &a);
    if(a == ' '){
        return 0;
    }
    int count;
    count = num(str,a);
    printf("%d", count);
    return 0;
}
求教最后一个用例没过去,是啥问题啊
发表于 2024-05-12 15:03:09 回复(2)
加油呀
#include<stdio.h>
#include<string.h>

int main(void){
   char str[1000];
 char a;
    int count = 0;
    fgets(str,sizeof(str),stdin);
    scanf("%c",&a);
    for(int i = 0; i < strlen(str); i++){
         if(a == str[i]){
         count++;
          }
       }
    printf("%d\n",count);
    return 0;
    }
编辑于 2024-04-24 15:11:09 回复(0)
#include <stdio.h>
#include <string.h>

#define MaxInputLength  1010
int main()
{
    char strRev[MaxInputLength] = {0};
    char checkChar = 0, checkChar2 = 0;
    int num = 0;
    int check2Flag = 0;
    fgets(strRev,MaxInputLength,stdin);
    do
    {
        checkChar = getchar();
    }while(checkChar =='\n');
    
    if(checkChar>='a' && checkChar<='z')
    {
        checkChar2 = checkChar+'A'-'a';
        check2Flag = 1;
    }
    else if(checkChar>='A' && checkChar<='Z')
    {
        checkChar2 = checkChar+'a'-'A';
        check2Flag = 1;
    }
    else {
        check2Flag = 0;
    }
    for(int i=0;i<MaxInputLength;i++)
    {
        if(check2Flag)
        {
            if(strRev[i] == checkChar || strRev[i] == checkChar2)
                num++;
        }
        else {
            if(strRev[i] == checkChar)
                num++;
        }
        
    }
    printf("%d",num);
    return 0;
}

编辑于 2024-04-15 12:10:08 回复(0)
#include <string.h>
#include <stdio.h>

int main() {
    int n=0;  
    char str[1000];
    char a;
    while (scanf("%s", str) != EOF) {

        scanf("%s", &a);
        for (int b=0; b<=strlen(str); b++) {
        if (str[b]==a||str[b]==a+32||str[b]==a-32) {n++;
       
        }
        }
        printf("%d",n);
    }
    return 0;
}为什么我一直输出上面声明的int n=0这个值啊
编辑于 2024-03-12 16:40:02 回复(1)
#include <stdio.h>
#include<string.h>

int main() {
    char str[1000],a;
    int len,count=0,i;
    gets(str);
    scanf("%c",&a);
    len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(a>='0'&& a<='9')
        {
            if(str[i]==a)
            count++;
        }
        else if(str[i]==a||str[i]+32==a||str[i]-32==a)
        count++;

    }
    printf("%d",count);

    return 0;
}
如果是数字要单独排除

编辑于 2024-03-02 16:37:22 回复(0)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*匹配大小写的个数*/
int Lowercase_Capital_Nums(char *pInputBuf,char *pMatchChar)
{
    int nums = 0;
    int i = 0;
    char *pTmp = pInputBuf;
    char MatchCharTmp = *pMatchChar;
    if('a' <= MatchCharTmp && MatchCharTmp <= 'z'){
        MatchCharTmp -= 32;
    }
    for(i = 0 ; i < strlen(pInputBuf) ; i++) {
        if('A' <= *pTmp && *pTmp <= 'Z'){
            if(*pTmp == MatchCharTmp){    
                nums++;
            }
        }else if('a' <= *pTmp && *pTmp <= 'z'){
            if((*pTmp - 32) == MatchCharTmp){
                nums++;
            }
        }else{
            if(*pTmp == MatchCharTmp){    
                nums++;
            }
        }
        pTmp++;
        continue;  
    }
    return nums;
}

int main()
{
    char str[1002] = {0};
    char ch = 0;
    fgets(str, sizeof(str), stdin);/*fget需要1002个字节保存*/
    //gets(str);
    scanf("%c", &ch);
    printf("%d",Lowercase_Capital_Nums(str,&ch));
    return 0;
}
发表于 2024-02-24 21:28:03 回复(0)
纯C语言笨解法。。。
#include <stdio.h>
#include <string.h>
int main() {
    char str1[1000];
    char str2;
    int num = 0;
    gets_s(str1);
    scanf("%c", &str2);
    if (65 <= str2 && str2<= 90) {
        for (int i = 0; i < strlen(str1); i++) {
            if (str2 == str1[i])
            {
                num = num + 1;
            }
            if (str2 == str1[i] - 32) 
            {
                num = num + 1;
            }
            
        }
    }
    if (97 <= str2 && str2 <= 122) {
        for (int i = 0; i < strlen(str1); i++) {
            if (str2 == str1[i])
            {
                num = num + 1;
            }
            else if (str2 == str1[i] + 32) {
                num = num + 1;
            }
        }
    }
    if (str2 < 65 || str2>122) {
        for (int i = 0; i < strlen(str1); i++) {
            if (str2 == str1[i]) {
                num = num + 1;
            }
        }
    }
    printf("%d", num);
}

发表于 2024-02-20 21:35:41 回复(0)
#include <stdio.h>
#include <string.h>

int main( )
{
    char strArr[ 1001 ] = { 0 };
    char str;
    gets( strArr );
    scanf( "%c", &str );
    int sz = strlen( strArr );
    int cnt = 0;
    int i = 0;
    for( i = 0; i < sz; i++ )
    {
        if( ( str == strArr[ i ] ) ||
            ( ( str | 0x20 ) == strArr[ i ] ) ||
            ( ( strArr[ i ] | 0x20 ) == str ) )
        {
            cnt++;
        }
    }

    printf( "%d\n", cnt );

    return 0;
}

发表于 2024-01-16 21:35:30 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char str[1002] = {0};//测1000个用例,多出的2个字节是保存'\0''\n'的?
    int num = 0;
    fgets(str,sizeof(str), stdin);
    char ch = 0;
    scanf("%c", &ch);
    if((ch >= 'a') && (ch <= 'z') )
    {
        ch -= 32;
    }
    for (int i = 0;i < strlen(str);i++) 
    { 
        if((str[i] >= 'a') && (str[i] <= 'z') )
         {
            if (ch == (str[i] - 32))
            {
                num++;
            }
         }
       else if (ch == str[i])
       {
            num++;
       }   
    }
    printf("%d\n", num);
    return 0;
}

发表于 2023-10-18 16:50:18 回复(0)
案例跑过,不知道输入空格匹配,还有问题
#include
<ctype.h>
#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>

int main() {
    char str[1001]={0},inc;    
    int anum=0;
    gets(&str);
    scanf("%c",&inc);
    if (inc >='0' && inc<='9' || inc == ' ')  {
        for(int i=0;i<=strlen(str);i++){
            if(inc==str[i]) anum++;
        }
    }else {
        for(int i=0;i<=strlen(str);i++){
            if(toupper(inc)== toupper(str[i])) anum++;
        }
    }
    printf("%d",anum);

}
发表于 2023-09-14 13:49:42 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define STLEN 1010

// 1.处理输入
// 2、统计个数strchr
//     2.1、若是数字
//     2.2、若是字母,则要分别统计大写字母和小写字母的个数再相加

int main() {
    
    char str[STLEN] = {0};
    char ch;
    unsigned count = 0;

    fgets(str, STLEN, stdin);
    ch = getchar();

    char *find = NULL;
    if(isdigit(ch))
    {
        // while((find = strchr(str, ch)))
        // {
        //     ++ count;
        // }
        find = strchr(str, ch);
        while(find)
        {
            count ++;
            find = strchr(find+1, ch);
        }
    }

    if(isalpha(ch))
    {
        ch = tolower(ch);
        find = strchr(str, ch);
        while(find)
        {
            count ++;
            find = strchr(find+1, ch);
        }

        ch = toupper(ch);
        find = strchr(str, ch);
        while(find)
        {
            count ++;
            find = strchr(find+1, ch);
        }

    }


    printf("%u", count);

    return 0;
}

发表于 2023-09-03 00:02:26 回复(0)
#include<stdio.h>
#include<ctype.h>
void string_test(const char [], char);

int main() {
    char arr[1000];
    char ch;
    fgets(arr, 1000, stdin);
    scanf("%c", &ch);
    string_test(arr, ch);
}

void string_test(const char arr[], char ch) {
    int count = 0;
    while (*arr) {
        if (toupper(*arr) == toupper(ch)) {
            count++;
        }
        arr++;
    }
    printf("%d", count);
}
/* 使用了toupper函数来实现不区分大小写,而且如果不是小写字符原函数返回原参数,这样理解起来应该是对数字检测没有影响的,但是没通过最好一个很长的测试示例 */
发表于 2023-08-28 10:13:19 回复(1)