华为机试总结


(2021-4-22)字符串最后一个单词的长度

1、题目

在这里插入图片描述

2、答案

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

int main()
{
    char str[5000];
    int count = 0;
    char *str_p = str;           //定义一个字符指针,其指向一个数组
    
    gets(str);                   //输入一行字符串
    
    int str_len = strlen(str);   //获取字符串的长度
    str_p = str_p +str_len -1;   //让该指针指向最后一个字符
    
   for( int i=0; i < str_len; i++ )
   {
       if( *str_p == ' ' )
       {
           break;
       }
       else
       {
           count++;
           str_p--;
       }
   }
    
    printf("%d", count);
 
}

在这里插入图片描述

3、所用到的知识点

3.1、gets函数知识

gets函数,可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
gets是从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

3.1.1、基本介绍

函数:gets(字符指针)
头文件:stdio.h(c),cstdio(c++)
原型:chargets(char);

3.1.2、返回值

读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。

3.1.3、功能介绍

从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。
换行符不作为读取串的内容,读取的换行符被转换为NUL值,并由此来结束字符串。

3.1.4、注意事项

本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。

3.2、scanf函数知识

scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量。

3.2.1、函数原型

函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。

3.2.2、返回数值

scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。

3.3、strlen函数知识

strlen是C语言标准函数库中的标准函数。
其功能是:计算字符串的长度,strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。

3.3.1、函数原型

头文件:string.h或cstring
格式:strlen (字符数组名)
功能:计算给定字符串的(unsigned int型)长度,不包括’\0’在内
说明:返回s的长度,不包括结束符NULL。

3.3.2、区别介绍

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。
sizeof是取字节运算符(关键字),strlen是函数。
sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’\0’结尾的。

3.4、字符串


(2021-4-22)计算某字母出现次数

1、题目

在这里插入图片描述

2、答案

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

int main()
{
    char c, str[5000];
    int i, count=0;
    memset(str, 0, sizeof(str));   //将字符串清0
    
    gets(str);                     //输入一行字符串
    scanf( "%c", &c );             //输入一个字符
    int str_len = strlen(str);     //计算字符串长度
    
    //将c转换为小写字母,A--65,a--97
    if( c >= 'A' && c <= 'Z' )
    {
        c += 32;
    }
    
    for( i=0; i < str_len; i++ )
    {
        //若*str_p为大写字母,将其变为小写字母
        if( str[i] >= 'A' && str[i] <= 'Z' )
        {
            str[i] += 32;
        }
        
        if( str[i] == c )
        {
            count++;
        }
        
        
    }
    printf( "%d", count );
 
    return 0;
}

3、所用到的知识点

3.1、memset函数知识

memset是计算机中C/C++语言函数。
将s所指向的某一块内存中的后n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。

3.1.1、函数原型

void *memset(void *s, int ch,size_tn);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

3.2、gets函数知识

gets函数,可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
gets是从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

3.2.1、基本介绍

函数:gets(字符指针)
头文件:stdio.h(c),cstdio(c++)
原型:chargets(char);

3.2.2、返回值

读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。

3.2.3、功能介绍

从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。
换行符不作为读取串的内容,读取的换行符被转换为NUL值,并由此来结束字符串。

3.2.4、注意事项

本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。


(2021-4-23)明明的随机数

1、题目

在这里插入图片描述

2、答案

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

int main()
{
    int n;
    int a;
    
    while( ~scanf( "%d", &n ) )
    {
        int count[1001] = {0};
        for( int i=0; i < n; i++ )
        {
            scanf( "%d", &a );         //输入学号
            count[a] = 1;              //将这些学号作为下标,其对应数组数赋值为1,记录此学号,然后将相同输入删除
        }
        for( int i=0; i < 1001; i++ )
        {
            if( count[i] == 1 )       //判断这些学号是否被输入
            {
                printf( "%d\n", i );
            }
        }
 
    }

    return 0;
}

在这里插入图片描述

3、所用到的知识点


(2021-4-23)字符串分隔

1、题目

在这里插入图片描述

2、答案

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

int main()
{
    
    char str[105];
    //在黑框中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾“,
    //因此需要用< Ctrl + Z >组合键,然后按< Enter >键的方式来告诉系统已经
    //到了 EOF,这样系统才会结束 while
    while( scanf( "%s", str ) != EOF )   //输入一个字符串
    {
        int len, count = 0;
        len = strlen( str );             //字符串的长度
        
        for( int i = 0; i < len; i++ )   //输出字符串
        {
            if( i>0 && i % 8 == 0 )      //每八个字母输出一个换行符
            {
                printf( "\n" );
                count = 0;
            }
            
            printf( "%c", str[i] );
            count++;
            
        }
        
        while( count < 8 )                //确保最后一个不是8个字符,补0
        {
            printf( "0" );
            count++;
        }
        printf( "\n" );
   
    }
    return 0;
}

在这里插入图片描述

3、所用到的知识点

3.1、EOF

EOF为计算机术语End Of File的缩写。在操作系统中表示资料源无更多的资料可读取。在C标准库中,像getchar这样的数据读取函数返回一个与符号(宏)EOF相等的值来指明文件结束的情况发生,EOF的真实值与不同的平台有关(但通常是-1,比如在glibc中),并且不等于任何有效的字符代码。

3.1.1、术语介绍

计算机术语,缩写通常为EOF(EndOfFile),在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(endoffile)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。

3.2、 while( scanf( “%s”, str ) != EOF )

EOF(end of file)就是文件的结束,通常来判断文件的操作是否结束的标志。
EOF不是特殊字符,而是定义在头文件<stdio.h>的常量,一般等于-1;

  //在黑框中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾“,
  //因此需要用< Ctrl + Z >组合键,然后按< Enter >键的方式来告诉系统已经
  //到了 EOF,这样系统才会结束 while
  while( scanf( "%s", str ) != EOF )   //输入一个字符串

除了文件结束,做题遇见最多的是标准输入,但是标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF:
Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出“标准输入”的缓存区,所以这时必须按两次Ctrl-D);
Windows中,Ctrl-Z表示EOF。


(2021-4-24)

1、题目

在这里插入图片描述

2、答案

#include <stdio.h>

int main()
{
    int c;
    while( scanf( "%x", &c ) != EOF)
    {
        printf( "%d\n", c );
    }
     return 0;
}

3、所用到的知识点

3.1、EOF

EOF为计算机术语End Of File的缩写。在操作系统中表示资料源无更多的资料可读取。在C标准库中,像getchar这样的数据读取函数返回一个与符号(宏)EOF相等的值来指明文件结束的情况发生,EOF的真实值与不同的平台有关(但通常是-1,比如在glibc中),并且不等于任何有效的字符代码。

3.1.1、术语介绍

计算机术语,缩写通常为EOF(EndOfFile),在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(endoffile)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。

3.2、 while( scanf( “%s”, str ) != EOF )

EOF(end of file)就是文件的结束,通常来判断文件的操作是否结束的标志。
EOF不是特殊字符,而是定义在头文件<stdio.h>的常量,一般等于-1;

  //在黑框中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾“,
  //因此需要用< Ctrl + Z >组合键,然后按< Enter >键的方式来告诉系统已经
  //到了 EOF,这样系统才会结束 while
  while( scanf( "%s", str ) != EOF )   //输入一个字符串

除了文件结束,做题遇见最多的是标准输入,但是标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF:
Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出“标准输入”的缓存区,所以这时必须按两次Ctrl-D);
Windows中,Ctrl-Z表示EOF。


(2021-4-24)

1、题目

2、答案

3、所用到的知识点

3.1、函数知识


(2021-4-24)

1、题目

2、答案

3、所用到的知识点

3.1、函数知识


(2021-4-24)

1、题目

2、答案

3、所用到的知识点

3.1、函数知识


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值