笨办法学C 练习10:字符串数组和循环

孙秀
• 阅读 1639

练习10:字符串数组和循环

原文:Exercise 10: Arrays Of Strings, Looping

译者:飞龙

你现在可以创建不同类型的数组,并且也知道了“字符串”和“字节数组”是相同的东西。接下来,我们要更进一步,创建一个包含字符串的数组。我也会介绍第一个循环结构,for循环来帮我们打印出这一新的数据结构。

这一章的有趣之处就是你的程序中已经有一个现成的字符串数组,main函数参数中的char *argv[]。下面这段代码打印出了所有你传入的命令行参数:

include <stdio.h>

int main(int argc, char *argv[])
{
    int i = 0;

    // go through each string in argv
    // why am I skipping argv[0]?
    for(i = 1; i < argc; i++) {
        printf("arg %d: %s\n", i, argv[i]);
    }

    // let's make our own array of strings
    char *states[] = {
        "California", "Oregon",
        "Washington", "Texas"
    };
    int num_states = 4;

    for(i = 0; i < num_states; i++) {
        printf("state %d: %s\n", i, states[i]);
    }

    return 0;
}

for循环的格式是这样的:

for(INITIALIZER; TEST; INCREMENTER) {
    CODE;
}

下面是for循环的工作机制:

  • INITIALIZER中是用来初始化循环的代码,这个例子中它是i = 0

  • 接下来会检查TEST布尔表达式,如果为false(0)则跳过CODE,不做任何事情。

  • 执行CODE,做它要做的任何事情。

  • CODE执行之后会执行INCREMENTER部分,通常情况会增加一些东西,比如这个例子是i++

  • 然后跳到第二步继续执行,直到TESTfalse(0)为止。

例子中的for循环使用argcargv,遍历了命令行参数,像这样:

  • OS将每个命令行参数作为字符串传入argv数组,程序名称./ex10在下标为0的位置,剩余的参数紧随其后。

  • OS将argc置为argv数组中参数的数量,所以你可以遍历它们而不会越界。要记住如果你提供了一个参数,程序名称是第一个,参数应该在第二个。

  • 接下来程序使用i < argc测试i是否使用argc,由于最开始1 < 2,测试通过。

  • 之后它会执行代码,输出i,并且将i用做argv的下标。

  • 然后使用i++来运行自增语句,它是i = i + 1的便捷形式。

  • 程序一直重复上面的步骤,直到i < argc值为false(0),这时退出循环但程序仍然继续执行。

你会看到什么

你需要用两种方法运行它来玩转这个程序。第一种方法是向命令行参数传递一些东西来设置argcargv。第二种是不传入任何参数,于是你可以看到第一次的for循环没有被执行,由于i < argc值为false

理解字符串数组

你应该可以从这个练习中弄明白,你在C语言中通过混合char *str = "blah"char str[] = {'b','l','a','h'}语法构建二维数组来构建字符串数组。第十四行的char *states[] = {...}语法就是这样的二维混合结构,其中每个字符串都是数组的一个元素,字符串的每个字符又是字符串的一个元素。

感到困惑吗?多维的概念是很多人从来都不会去想的,所以你应该在纸上构建这一字符串数组:

  • 在纸的左边为每个字符串画一个小方格,带有它们的下标。

  • 然后在方格上方写上每个字符的下标。

  • 接着将字符串中的字符填充到方格内。

  • 画完之后,在纸上模拟代码的执行过程。

理解它的另一种方法是在你熟悉的语言,比如Python或Ruby中构建相同的结构。

如何使它崩溃

  • 使用你喜欢的另一种语言,来写这个程序。传入尽可能多的命令行参数,看看是否能通过传入过多参数使其崩溃。

  • i初始化为0看看会发生什么。是否也需要改动argc,不改动的话它能正常工作吗?为什么下标从0开始可以正常工作?

  • num_states改为错误的值使它变大,来看看会发生什么。

附加题

  • 弄清楚在for循环的每一部分你都可以放置什么样的代码。

  • 查询如何使用','(逗号)字符来在for循环的每一部分中,';'(分号)之间分隔多条语句。

  • 查询NULL是什么东西,尝试将它用做states的一个元素,看看它会打印出什么。

  • 看看你是否能在打印之前将states的一个元素赋值给argv中的元素,再试试相反的操作。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
双十一预售活动分析
2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
JavaScript中遍历数组和对象的方法
js数组遍历和对象遍历针对js各种遍历作一个总结分析,从类型用处,分析数组和对象各种遍历使用场景,优缺点等JS数组遍历:1,普通for循环,经常用的数组遍历vararr1,2,0,3,9,10,20,
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
4年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Wesley13 Wesley13
4年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na