CS50x 2024 - Lecture 2 - Arrays

00:00:00 - Introduction

00:01:01 - Story Time

00:06:03 - Compiling

make本身并不是编译器,实际上是一个自动运行编译器的程序,如c语言的clang

clang -o hello hello.c
src/ $ clang -o hello hello_world.c 
/usr/bin/ld: /tmp/hello_world-67f514.o: in function `main':
hello_world.c:(.text+0x1d): undefined reference to `get_string'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果使用第三方库,不一定是c语言附带的库,例如cs50的库,那么必须告诉编译器想要使用什么库,不仅包括头文件,还包括附加命令

clang -o hello hello.c -lcs50

make在你不知道的情况使用了-o,和-lcs50

运行clang时(编译),会发生四种不同的事情

preprocessing  //预处理就是将#include包含的行转换为文件中的任何底层原型
compiling   //编译将源代码转为汇编语言
assembling  //汇编将汇编语言转换为机器语言
linking  //hello.c stdio.c cs50.c 是分别单独编译的,链接将他们组合为一个最终文件

Clang和GCC是两个广泛使用的编译器,它们都可以编译C、C++、Objective-C等语言的代码,但它们在设计、性能、兼容性和错误报告等方面有一些不同。

设计和目标

  • Clang 是基于LLVM(Low Level Virtual Machine)项目的一部分,设计目标是提供一个基于LLVM的C语言族编译器,强调编译速度和内存使用效率,以及生成的代码的性能。Clang设计为易于使用和易于集成到其他项目中,提供了丰富的错误和警告信息,旨在提高开发效率。
  • GCC(GNU Compiler Collection)是一个开源编译器集合,支持多种编程语言。GCC最初作为GNU操作系统的一部分开发,目标是提供一个自由软件的编译器。GCC着重于优化和支持多种架构,包括x86、ARM、MIPS等。

性能和优化

  • ClangGCC 在性能方面通常相当接近,尽管在不同的测试和不同版本中,一个可能比另一个表现得更好。Clang通常编译速度更快,尤其是对于C++代码,而GCC在某些优化方面可能更先进,尤其是在生成高度优化的代码方面。

错误报告

  • Clang 的错误报告通常被认为比GCC更友好和更清晰。Clang致力于提供易于理解的错误消息和诊断信息,包括错误位置和可能的解决方案建议。
  • GCC 近年来也在改进其错误消息的清晰度和有用性,但Clang在这方面通常被认为具有优势。

兼容性

  • Clang 致力于与GCC兼容,尽量支持GCC的扩展和行为,以便开发者可以无缝迁移代码。
  • GCC 作为一个更早期的项目,有自己的扩展和特性,这些在某些情况下可能导致与Clang的兼容性问题。

开发者生态

  • Clang 由于其设计和易用性,被许多现代项目和开发环境采用,包括Xcode和许多基于LLVM的工具。
  • GCC 长期以来一直是Linux和开源社区的主力编译器,具有广泛的用户基础和成熟的技术支持。

总结

选择Clang还是GCC取决于特定的项目需求、目标平台和开发者偏好。对于追求编译速度和更好的错误报告的项目,Clang可能是更好的选择。对于需要特定优化或在特定架构上运行的项目,GCC可能更合适。两者都是强大的工具,能够满足现代软件开发的需求。

00:28:40 - Debugging

当你没有复杂工具调试时,printf是你的朋友,但是会增加复杂性

更强大的工具:debugger,将会节省大量时间
debug50,可以向cs50 duck询问不理解的概念

00:47:27 - Memory

00:52:37 - scores.c

00:57:39 - Arrays

数组是内存中背靠背的值序列
01:13:59 - Strings
其实就是字符数组,如果一个字节中全为0则意味着字符串在这里结束
在这里插入图片描述
在这里插入图片描述
\0称为NUL,表示终止字符的0字节

在这里插入图片描述

01:33:12 - String Length

#include <stdio.h>
#include <cs50.h>

int get_length(string s);
int main() {
    string name = get_string("your name?");
    printf("%i\n",get_length(name));

}

int get_length(string s) {
    int n = 0;
    while (s[n] != '\0') {
        n++;
    }
    return n;
}

运用string library

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

int main() {
    string name = get_string("your name?");
    printf("%lu\n",strlen(name));

}



01:44:33 - uppercase.c

在这里插入图片描述

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


int main() {
    string s = get_string("Before: ");
    printf("After: ");
    for (int i = 0, n = strlen(s); i < n; i++) {
        printf("%c", toupper(s[i]));
    }
    printf("\n");
}

01:50:05 - Command-line Arguments

#include <stdio.h>

int main(int argc, string argv[]) {
	
}

argcargv 是在C语言(以及一些其他编程语言,如C++)中用于处理命令行参数的两个变量,它们在程序启动时由操作系统传递给程序。这两个变量通常在程序的主函数main的参数列表中定义,它们代表了:

  • argc(Argument Count的缩写)表示命令行参数的数量。这个数量包括程序本身的名称,所以argc的值至少为1。

  • argv(Argument Vector的缩写)是一个指向字符串数组的指针,这个数组存储了具体的命令行参数。argv[0]是程序的名称,argv[1]是第一个参数,以此类推,直到argv[argc-1]argv[argc]是一个空指针(NULL),用于标识数组的结束。

通过这两个变量,程序可以接收和处理用户在命令行中输入的参数,使程序的行为可以根据这些参数进行调整。例如,用户可以通过命令行参数指定文件路径、配置选项等信息。

简单的示例代码如下:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Program name: %s\n", argv[0]);
    printf("Number of arguments: %d\n", argc-1);
    for(int i = 1; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
    return 0;
}

在这个例子中,如果程序名为example,并且被调用时使用了两个参数file.txt-option,那么argc的值将是3,argv数组将包含["example", "file.txt", "-option"]

01:57:58 - Cowsay
cowsay是一个在命令行界面上用于生成由ASCII字符画的牛(或其他动物)所“说出”的文本的程序。它通常用于在命令行会话中添加一点幽默或个性化元素。用户可以通过输入一个字符串来创建一个由牛头围绕的文本气泡,好像是这只牛在“说”这段文字。

cowsay最初是由Tony Monroe以Perl语言编写的,并且随时间发展,它已经被移植到了多种操作系统上。除了默认的牛图案,cowsay还支持多种其他动物和角色的图案,这些图案通常通过修改程序的配置文件或使用特定的命令行选项来选择。

使用cowsay非常简单,基本的命令格式如下:

cowsay [options] text

这里的text是你希望“牛”说的话,[options]可以是用来改变输出字符画的各种选项,比如选择不同的角色(例如羊、龙、鬼等)。

cowsay不仅是一个有趣的小工具,也体现了开源社区的幽默感和创意。它可通过各种Linux发行版的包管理器安装,也可在其他操作系统上通过兼容层或移植版本使用。

01:59:44 - Exit Status

我们的程序默认是以0返回值退出
echo $? 可以看到秘密的返回值

#include <stdio.h>
#include <cs50.h>

int main(int argc, string argv[]) {
    if (argc != 2) {
        printf("missing value in command line\n");
        return 1;
    }
    printf("hello ,%s\n",argv[1]);
    return 0;
}

02:05:48 - Cryptography

在这里插入图片描述
key通常是很多位的
凯撒密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/380791.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 面试题 | 19.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

你的立身之本是什么?

去年发生的一切&#xff0c;大到疫情、政治经济形势、行业的萎靡和震荡&#xff0c;小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们&#xff1a; 当冲击到来的时候&#xff0c;它是不会提前跟你打招呼的。 接下来的10年&#xff0c;我们所面临的不确定性&#xff0c;比起…

Linux 软件管理(YUM RPM)

1 YUM yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&#xff0c;无须繁琐地一次次…

fps cf游戏,一键断网辅助工具

一键断网瞬移 工具特色&#xff1a;一改常规断网操作&#xff08;断网开启&#xff0c;所有人都卡住&#xff0c;使得还原后找不到人的问题 &#xff09;&#xff0c;不影响任何人移动&#xff0c;开启断网跟着别人一起走&#xff0c;其他人无任何异常卡顿。 工具功能&…

Linux应用程序几种参数传递方式

大家好&#xff0c;今天给大家介绍Linux应用程序几种参数传递方式&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在Linux中&#xff0c;应用程序可以通过多种方式接收参数。以下…

文心一言 VS 讯飞星火 VS chatgpt (198)-- 算法导论14.3 6题

六、用go语言&#xff0c;说明如何来维护一个支持操作MIN-GAP的一些数的动态集Q&#xff0c;使得该操作能给出Q中两个最接近的数之间的差值。例如&#xff0c;Q(1&#xff0c;5&#xff0c;9&#xff0c;15&#xff0c;18&#xff0c;22)&#xff0c;则MIN-GAP返回18-153&#…

【EAI 011】SayCan: Grounding Language in Robotic Affordances

论文标题&#xff1a;Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 论文作者&#xff1a;Michael Ahn, Anthony Brohan, Noah Brown, Yevgen Chebotar, Omar Cortes, Byron David, Chelsea Finn, Chuyuan Fu, Keerthana Gopalakrishnan, Karol Hausm…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff08;木马、病毒、恶意脚本、webshell等&#xff09;&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方&#xff0c;由于程序对用户上传…

C语言笔试题之求出二叉树的最大深度(递归解决)

实例要求&#xff1a; 1、给定一个二叉树 root &#xff0c;返回其最大深度&#xff1b;2、二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数&#xff1b; 案例展示&#xff1a; 实例分析&#xff1a; 1、判断根节点是否为空&#xff1b;2、分别递归处理左…

物联网数据隐私保护技术

在物联网&#xff08;IoT&#xff09;的世界中&#xff0c;无数的设备通过互联网连接在一起&#xff0c;不断地收集、传输和处理数据。这些数据有助于提高生产效率、优化用户体验并创造新的服务模式。然而&#xff0c;随着数据量的剧增&#xff0c;数据隐私保护成为了一个不能忽…

【java苍穹外卖项目实战二】苍穹外卖环境搭建

文章目录 1、前端环境搭建2、后端环境搭建1、项目结构搭建2、Git版本控制3、数据库创建 开发环境搭建主要包含前端环境和后端环境两部分。 前端的页面我们只需要导入资料中的nginx&#xff0c; 前端页面的代码我们只需要能看懂即可。 1、前端环境搭建 前端运行环境的nginx&am…

《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)

文章目录 7.1 配置和使用 MySQL 监控工具7.1.1 基础知识7.1.2 重点案例&#xff1a;使用 Python 和 Prometheus 监控 MySQL 性能7.1.3 拓展案例 1&#xff1a;自动化 MySQL 慢查询日志分析7.1.4 拓展案例 2&#xff1a;实时警报系统 7.2 解读 MySQL 日志文件7.2.1 基础知识7.2.…

【Spring】Bean 的实例化方式

Spring 为 Bean 提供了多种实例化方式&#xff0c;通常包括4种方式 也就是说在 Spring 中为 Bean 对象的创建准备了多种方案&#xff0c;目的是&#xff1a;更加灵活 第一种&#xff1a;通过构造方法实例化 第二种&#xff1a;通过简单工厂模式实例化 第三种&#xff1a;通过…

【第二届 Runway短视频创作大赛】——截至日期2024年03月01日

短视频创作大赛 关于AI Fil&#xff4d; Festival竞赛概况参加资格报名期间报名方法 提交要求奖品附录 关于AI Fil&#xff4d; Festival 2022年成立的AIFF是一个融合了最新AI技术于电影制作中的艺术和艺术家节日&#xff0c;让我们得以一窥新创意时代的风采。从众多参赛作品中…

求职|基于Springboot的校园求职招聘系统设计与实现(源码+数据库+文档)

校园求职招聘系统目录 目录 基于Springboot的校园求职招聘系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、企业信息管理 3、公告类型管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

华为机考入门python3--(11)牛客11-数字颠倒

分类&#xff1a;字符串 知识点&#xff1a; int转字符串 str int(num) 对字符串进行逆序 my_str str[::-1] 题目来自【牛客】 def reverse_integer(n): # 将整数转换为字符串 str_n str(n) # 使用[::-1]来反转字符串 reversed_str str_n[::-1] return reversed…

力扣刷题之旅:进阶篇(三)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 一、动态规划&#xff08;DP&#xff09; 首先&#xff0c;让我们来…

【JAVA WEB】 css背景属性 圆角矩形的绘制

目录 背景属性设置 圆角矩形 背景属性设置 背景颜色,在style中 background-color:颜色&#xff1b; 背景图片 background-image:url(……) 背景图片的平铺方式 background-repeat: 平铺方式 repeat 平铺&#xff08;默认&#xff09;no-repeat 不平铺repeat-x 水平平铺repea…

Zabbix 配置实时开通的LDAP认证-基于AD

介绍 本教程适用于6.4-7.0版本的Zabbix&#xff0c;域控&#xff08;AD&#xff09;使用Windows Server 2022搭建&#xff0c;域控等级为 2016。 域控域名为 songxwn.com 最终实现AD用户统一认证&#xff0c;统一改密&#xff0c;Zabbix用户自动添加。&#xff08;6.4之前不…