CS50x 2024 - Lecture 2 - Arrays

news2024/11/15 3:45:05

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通常是很多位的
凯撒密码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作与生活平衡:在生活中寻找和谐

工作和生活是我们生活中不断交织的两个重要方面。对许多人来说&#xff0c;找到两者之间的完美平衡已经成为一个持久的挑战。然而&#xff0c;与其专注于平衡&#xff0c;更重要的是要认识到工作和生活并不是可以相互平衡的两个分离实体&#xff0c;而是一个相互影响的循环。正…

WebSocket+Http实现功能加成

WebSocketHttp实现功能加成 前言 首先&#xff0c;WebSocket和HTTP是两种不同的协议&#xff0c;它们在设计和用途上有一些显著的区别。以下是它们的主要特点和区别&#xff1a; HTTP (HyperText Transfer Protocol): 请求-响应模型&#xff1a; HTTP 是基于请求-响应模型的协…

Leetcode刷题笔记题解(C++):面试题 08.07. 无重复字符串的排列组合

思路&#xff1a;因为字符之间互不相同&#xff0c;故使用全排列的方式去解题&#xff1b; 字符串长度为n&#xff0c;将第一个字母分别与后面每一个字母进行交换&#xff0c;生成n种不同的全排列&#xff1b;再用第二个元素与后面每一个元素进行交换&#xff0c;生成n - 1种不…

Spring Authorization Server Spring Security密码加密

文章目录 一、修改密码编码器二、效果三、注意点1. RegisteredClient2. UserDetailsService 一、修改密码编码器 以BCryptPasswordEncoder举例。 直接将其注册成PasswordEncoder 的Bean即可。 Beanpublic PasswordEncoder passwordEncoder() {// 密码为明文方式 // ret…

【PTA浙大版《C语言程序设计(第4版)》|编程题】习题7-3 判断上三角矩阵(附测试点)

目录 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 代码呈现 测试点 上三角矩阵指主对角线以下的元素都为0的矩阵&#xff1b;主对角线为从矩阵的左上角至右下角的连线。 本题要求编写程序&#xff0c;判断一个给定的方阵是否…

图论与图数据应用综述:从基础概念到知识图谱与图智能

目录 前言1 图论基础概念1.1 节点度1.2 度分布1.3 邻接矩阵 2 探索图的高级概念2.1 最短路径的关键性2.2 图的直径与平均路径的意义2.3 循环与路径类型的多样性 3 深入探讨图的广泛应用领域3.1 知识图谱的知识管理3.2 图智能在复杂决策中的应用3.3 图数据挖掘与分析的多领域应用…

【Linux】POSIX信号量基于环形队列的生产消费模型

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 引入1. POSIX信号量1.1 信号量的概念1.2 信号量的使用1.2.1 信号量的初始化1.2.2信号…

AI助力农作物自动采摘,基于DETR(DEtection TRansformer)开发构建番茄采摘场景下番茄成熟度检测识别计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

IOS破解软件安装教程

对于很多iOS用户而言&#xff0c;获取软件的途径显得较为单一&#xff0c;必须通过App Store进行下载安装。 这样的限制&#xff0c;时常让人羡慕安卓系统那些自由下载各类版本软件的便捷。 心中不禁生出疑问&#xff1a;难道iOS世界里&#xff0c;就不存在所谓的“破解版”软件…

Visual Studio 2010+C#实现信源编码

1. 要求 本文设计了一套界面系统&#xff0c;该系统能够实现以下功能&#xff1a; 克劳夫特不等式的计算&#xff0c;并且能够根据计算结果给出相应的信息。可通过用户输入的初始条件然后给出哈夫曼编码以及LZ编码&#xff0c;结果均通过对话框来显示哈夫曼编码结果包含相应的…

解密输入输出迷局:蓝桥杯与ACM中C++/C语言常见问题揭秘

关于C中的常见输入输出汇总 带空格的字符串&#xff1a; ​ 对于这种输入方式我们选择使用gets() 函数来进行输入&#xff0c;gets用于从标准输入&#xff08;通常是键盘&#xff09;读取一行文本并将其存储为字符串&#xff0c;直到遇到换行符&#xff08;‘\n’&#xff09…

Fink CDC数据同步(四)Mysql数据同步到Kafka

依赖项 将下列依赖包放在flink/lib flink-sql-connector-kafka-1.16.2 创建映射表 创建MySQL映射表 CREATE TABLE if not exists mysql_user (id int,name STRING,birth STRING,gender STRING,PRIMARY KEY (id) NOT ENFORCED ) WITH (connector mysql-cdc,hostn…

飞书上传图片

飞书上传图片 1. 概述1.1 访问凭证2. 上传图片获取image_key1. 概述 飞书开发文档上传图片: https://open.feishu.cn/document/server-docs/im-v1/image/create 上传图片接口,支持上传 JPEG、PNG、WEBP、GIF、TIFF、BMP、ICO格式图片。 在请求头上需要获取token(访问凭证) …

go消息队列RabbitMQ - 订阅模式-fanout

1、发布订阅 订阅模式&#xff0c;消息被路由投递给多个队列&#xff0c;一个消息被多个消费者获取。 1&#xff09; 可以有多个消费者 2&#xff09; 每个消费者有自己的queue&#xff08;队列&#xff09; 3&#xff09; 每个队列都要绑定到Exchange&#xff08;交换机&…

Linux系统安装(CentOS Vmware)

学习环境安装 VMware安装 VMware下载&安装 访问官网&#xff1a;https://www.vmware.com 在此处可以选择语言 点击China&#xff08;简体中文&#xff09; 点击产品&#xff0c;点击Workstation Pro 下滑&#xff0c;点击下载试用版 下滑找到Workstation 17 Pro for Wi…

ARP欺骗攻击利用之内网截取图片

Arp欺骗&#xff1a;目标ip的流量经过我的网卡&#xff0c;从网关出去。 Arp断网&#xff1a;目标ip的流量经过我的网卡 1. echo 1 >/proc/sys/net/ipv4/ip_forward 设置ip流量转发&#xff0c;不会出现断网现象 有时不能这样直接修改&#xff0c;还有另外一种方法 修…

基于华为云欧拉操作系统(HCE OS)容器化部署传统应用(Redis+Postgresql+Git+SpringBoot+Nginx)

写在前面 博文内容为 华为云欧拉操作系统入门级开发者认证(HCCDA – Huawei Cloud EulerOS)实验笔记整理认证地址&#xff1a;https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1博文内容涉及一个传统 Springboot 应用HCE部署&#x…

使用QT编写一个简单QQ登录界面

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(…

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 &#xff08;都是傻瓜式安装&#xff09;&#xff0c;然后注册小程序账号&#xff1a; 拿到appid&#xff1a; ②简单通过demo使用微信开发者工具和…

Linux——进程池(管道)

经过了管道的介绍之后&#xff0c;我们可以实现了进程间通信&#xff0c;现在我就来简单介 绍一下管道的应用场景——进程池。1. 引入 在我们的编码过程中&#xff0c;不乏会听到&#xff0c;内存池&#xff0c;进程池&#xff0c;空间配置器等等名词&#xff0c;这些是用来干…