笔试编程题1

最近刷笔试题,题目是将多个单词放进一个数组里,找出最后一个单词的长度。
看到题目的时候觉得还行应该挺简单的,就上手自己写了一下,大概地思路就是:先求出整个数组的大小,然后从末尾开始遍历数组,找到第一个空格的位置,然后用数组的长度减去空格的位置,就是最后一个单词的长度。
大概思路是没什么问题的,但是运行了之后就会发现,细节问题还是很多的。首先就是求数组的长度,大家都知道用sizeof()或者strlen(),但是这两个函数是有区别的:
sizeof是运算符,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:数组——编译时分配的数组空间大小;指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4)。
strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了。字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
最主要的是sizeof是算符,strlen是函数。 数组做sizeof的参数不退化,传递给strlen就退化为指针了。strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。说到这大概就知道第一个问题出在哪,我刚开始把str定义为char *str,用sizeof求大小,发现不是那么回事,和自己想的不一样。把sizeof换成strlen发现也不行,求出的是第一个单词的大小。这时就发现自己对这两个函数理解的不够,平时觉得知道有这两个函数,会用就行,但也仅仅只是“会用”。
解决了这个问题,下一个问题又来了,就是遍历使用for循环还是while循环,我平时喜欢用for循环,但是这个问题用for循环还要进行if判断,而且还容易出错。用while比较好,可能是自己太菜,知道可以用while,即使出错了还在那死磕for循环。while只需要判断空格的位置,判断i是否大于0,不满足每次i减一就行。
下面是代码

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

int main()
{
	
    char    str[1000]="\0";
    gets(str);
    int len=strlen(str);
    int i=len-1;/*从len-1的位置开始遍历*/
    while(str[i]!=32 && i>=0)/*判断是否为空格*/
    {
         i--;
     }
  
    int n=strlen(str)-i-1;
    printf("%d\n",n);
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值