华为机试题目1 字符串最后一个单词的长度(C和C++实现)

题目描述

计算字符串最后一个单词的长度,单词以空格隔开。

输入描述:

一行字符串,非空,长度小于5000。

输出描述:

整数N,最后一个单词的长度。

示例1

输入

hello world

输出

5

 C实现:

//最简单的方法就是,根本就不需要存储字符串,直接计算长度就可以了,也不需要动态的复杂的数据结构
#include <stdio.h>

int main()
{
	char ch; //int ch 好像更好 (见1)//关于char型请见3
	int n = 0;
	int flag = 0;

	while(1)
	{
		ch = getchar();//输入一行后再逐个读取(读一个就执行下面的程序,又因为while循环再继续回来读下一个。若没有这个while循环则不会再回来读下一个) 
                       //当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码。即ch只是每次循环读入的某一个字符的ASCII码。
		if(ch == '\n'){
		    break;
		}
		else if(ch != ' ')
		{
			if(flag == 0){
			    n = 0;
			    flag = 1;
			}
			n++;
		}
		else
		{
			flag = 0;
		}

	}
	printf("%d\n", n);
	return 0;
}

1,getchar的两点总结:

  1.getchar是以行为单位进行存取的。(输入一行后再逐个读取

  当用getchar进行输入时,如果输入的第一个字符为有效字符(即不是输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D),那么只有当最后一个输入字符为换行符'\n'(也可以是文件结束符EOF,EOF将在后面讨论)时, getchar才会停止执行,整个程序将会往下执行。譬如下面程序段:

  while((c = getchar()) != EOF){ putchar(c);}

  执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。

  对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

输出的过程:getchar有一个int型的返回值。当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。)

  对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF (Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。

  2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。

  这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:

  char c;

  c = getchar();

  这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R C中特别提到了这个问题):

  int c;

  c = getchar();

2,EOF的两点总结(主要指普通终端中的EOF)

  1.EOF作为文件结束符时的情况:

  EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。

  (1)遇到getchar函数执行时,要输入第一个字符时就直接输入Ctrl+D,就可以跳出getchar(),去执行程序的其他部分;

  (2)在前面输入的字符为换行符时,接着输入Ctrl+D;

  (3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的Ctrl+D的作用将在下面介绍。

  其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+D才相当于文件结束符。

  2.EOF作为行结束符时的情况,这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。

  这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+D,此时的Ctrl+D并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl+D,程序输出结果为:

  abcabc

  注意:第一组abc为从终端输入的,然后输入Ctrl+D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D,则起到了文件结束符的作用,结束getchar()。

  如果输入abc之后,然后回车,输入换行符的话,则终端显示为:

  abc         //第一行,带回车

  abc         //第二行

  //第三行

  其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。

  从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。

  EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。

3,基本数据类型(char型)

    1、char型(字符型)
    char型用来储存字符,但是计算机用数字编码储存字符,如美国用ASCII码。所以字符和ASCII码均可以表示char型。
    2、表示方法
    字符可以用字母表示,也可以用整数表示;如在ASCII码中,65代表大写字母A
    char grade=’A’;
    char grade=65;
    注意:char是字符型,用单引号表示,’A’;而字符串用双引号表示,”A”

 

C++实现:

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string str; //见1,string是个类,baistring str,是定义一du个名叫str的字符串对象。
    int count=0, flag=1;  // flag用来标记当前字符是否为空格
    while(getline(cin, str)) //见2
    {
        for(int i=str.length()-1;i>=0;--i) //见3
        {
            if(flag && str[i] ==' ') continue;  // 如果末尾有空格,先清除末尾空格 //见4  //见5
            else if(str[i] !=' ') 
            {
               flag=0;
               count++;
            }
            if(flag==0 && str[i] ==' ') break;
        }
    }
    cout<<count<<endl;
    return 0;
}

1,str内部保存着字符串的内容,通过str.c_str()可以获取这个字符串的首地址。

2,C++中的getline函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
   getline 函数如下所示:

   getline(cin, inputLine);

   其中 cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称。

3,C++ 中 for 循环的语法:

for ( init; condition; increment )
{
   statement(s);
}

     下面是 for 循环的控制流:

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。

4,C++ 中的 continue 语句有点像 break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

      对于 for 循环,continue 语句会导致执行条件测试和循环增量部分。对于 whiledo...while 循环,continue 语句会导致程序控制回到条件测试上。

5,c++中&和&&有什么区别:

     区别一:意思bai不同

     1、&表示按位与操作。

     2、&&表示逻du辑与的意思,即为zhiand。

     区别二:程序执dao行的时候不同

     1、当运算符&&两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。比如 12&&23的结果就是1,12&&-1 的结果是1,123&&0的结果就是0

     2、我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

     区别三:&&还具有短路的功能

     如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值