cmd应用基础 扫盲教程

cmd是什么?

对于程序员而言,cmd命令提示符是windows操作系统下一个比较重要的工具。对于程序员而言,为了追求更高的效率而抛弃花俏的界面已然是意见很常见的行为,截止到目前的,全世界仍有大量的服务器还使用着单一的命令行界面。

使用命令行界面的一个重要因素就是,在远程管理的过程中,命令行操作紧需要传递少量的数据就可以对机器进行操作,如果是图形界面,由于需要传输大量的图形数据,很可能出现延迟、链接不稳定等情况,亦或者在同样情况下效率没有使用命令行界面操作来得高。所以,至今人们依旧离不开命令行操作。

而cmd则是windows系列操作系统下的命令行操作程序(不论是命令行或者是桌面这样的图形界面本质上都是程序)。

命令行界面程序cmd.exe所在的目录是C:\Windows\System32

顺带一提我们的桌面(图形操作界面)则是位于C:\Windows下的explorer.exe

如何打开cmd

方法有很多,以下列举几种

1.打开C:\WindowsSystem32目录,找到cmd.exe双击运行。当然,通常人们都不会这么做。
2.打开开始菜单->运行->输入cmd->回车
3.通过快捷键:win(windows商标键) + r 调出运行框,然后输入cmd回车
4.win7打开开始菜单之后可以直接输入cmd回车

关于当前目录

对于新手而言,这是一个必须要搞清楚的问题。首先我们来学习几个命令:

cd C:\

cd是change directory的简写,意思是改变目录,上面这条命令的意思就是切换到C:\目录下。

可以观察到,cmd界面上的目录变成了C:\

我们可以从图中看到,cmd中的文字有变化,而有变化的地方就是我们要注意的地方。

在每一行的最前面就是当前目录的地址,例如最开始的

C:\Users\Lellansin>cd C:\

这当中”C:\Users\Lellansin”(如你的账户名称是Admin的话就是C:\Users\Admin,注意是win7的默认目录)就是我的当前目录而执行了cd C:\命令之后当前目录就变成了 C:\

当前目录是一个相对重要的概念,因为很多操作只能对当前目录里面的文件进行。就好比,通常情况下,你要操作E盘某个目录下的某个文件,你首先要双击“我的电脑”打开E盘相应的文件夹,找到那个目录才能操作那个目录下的文件一样。对于cmd而言,要操作相应目录下的文件需要切换到相应的目录。

#输入dir回车,系统会返回当前目录下的文件列表
dir

如何执行或打开文件

C:\>1.txt

如果我在C盘根目录下有一个1.txt的文本文件,那么就可以直接输入1.txt回车,即可打开该文件。(这个在linux下也是同样的情况,博主当年也搞不清楚怎么运行程序来着)

同样的,如果存在hello.exe,那么直接输入hello.exe即可运行该程序。当然需要注意的是,某些系统默认的应用程序格式(如.exe文件)在cmd中调用的时候是可以省略后缀的。也就是可以直接输入hello,然后回车也同样可以运行hello.exe。

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等。

常见的环境变量:

变量名			变量值
Path		...太多省略...
OS			Windows_NT
windir		%SystemRoot%
TMP			%SystemRoot%TEMP
ComSpec		%SystemRoot%system32cmd.exe

至于%SystemRoot%的值是什么,大家只要把它复制到文件浏览上面的地址栏里面然后回车就知道了。

环境变量的作用

为系统或者用户程序设置一些默认参数。比如windir这个环境变量,就可能有程序通过读取这个环境变量的值来查看系统的版本。

环境变量的设置方法

1.【我的电脑】->右键【属性】->【高级】->【环境变量】->选中你要修改的环境变量点击【编辑】即可
2.通过cmd设置(不推荐)

path的作用

path是一个很常见得环境变量。主要用来配置系统的默认路径。也就是当你在某个目录下执行某个程序,但是本身目录下却没有这个程序的时候,系统会自动到默认路径下面也去找一找,有没有你要执行的程序。

比如你写了一个hello.exe(编译运行后,能在在程序的相应的debug目录下能找到)。然后把这个hello.exe移动到E:\test目录下,接着

# 切换到E盘
cd E:\
# 切换到E盘下的test文件中
cd test
#执行hello.exe
hello.exe
# 假设程序输出hello world
# 这个时候再切换到E盘根目录下(cd .. 是切换到上级目录)
cd ..
# 再执行hello.exe
hello.exe
# 这个时候系统会提醒你找不到这个命令
# 但是如果你将 E:\test 这个目录加入到 path中,
# 就可以在任意地方运行hello.exe

cmd的常见作用

1.自动关机
2.常看本地ip
3.使用ping
4.快速查询本地服务、端口使用情况
5.快速调用一些常用工具
6.原始编程方式,用cmd调用编译
7.学汇编都应该知道cmd下的debug
8.批处理

自动关机

先说自动关机,貌似很多人都被开过自动关机的玩笑,我们通过cmd就可以实现自动关机命令

#输入shutdown回车可以看到下图效果
shutdown


shutdown并不是一个cmd命令而是一个windows系统自带的程序shutdown.exe,位于C:\WINDOWS\system32目录下,之所以能够直接执行,是因为C:\WINDOWS\system32目录,是系统默认配置在环境变量path中的。其他还有很多的自带程序都在这个目录,以下其他程序不做过多说明。(PS:这里仅仅只讲一些cmd的常见应用,至于cmd的语法之类的,讲了也有些鸡肋,如果想学习批处理再研究也不迟)
废话不多说,我们可以从上面的图片看到,直接输入程序自动给出了一些提示,这些参数告诉了我们这个shutdown.exe要怎么使用

shutdown -s

按照他提示的参数输入这个命令,会弹出提示:

博主是在xp下测试,当然如果是在win7等系统下的话效果会不一样。如果你在实验这个命令,不要慌张马上按照提示执行下面的命令:

#取消关机
shutdown -a

接下来我们来看一下这个程序最常用的方式:

#1小时(3600秒)后关机
shutdown -s -t 3600

博主就经常用到上面这个命令,甚至桌面常备取消关机的批处理(哈哈,当年没少被开过这种玩笑)
好吧,少年,你是要问我批处理是什么嘛?
请你新建一个文件把“shutdown -s -t 3600”复制进去,然后保存,另存为.bat后缀的文件(如何更改文件后缀,不懂请戳度娘谷歌),接着双击这个bat文件。
如果你看到系统提示你一小时后会自动关闭,那么恭喜你,你已经写好了一个自动关机的批处理文件。那么同样的可以想象,取消关机的批处理,就是一个.bat文件,里面写着一行“shutdown -a”,双击一下就可以运行了(批处理的特点之一)。

当然如果,想在C语言中调用这个命令也很简单。
先引入stdlib.h库。接着就可以通过system()命令来调用了,如:

#include<stdio.h>
#include<stdlib.h>
main()
{
    system("shutdown -s -t 3600");
    printf("自动关机已设置!");
}

常看本地ip

通过ipconfig.exe就可以查看本地ip

ipconfig

当然也可以通过 /? 参数获取更多的帮助

ipconfig /?

(PS:博主上面测试的时候写的是help,这个不是一个正确的参数,然后下面那个是弹出来的提示)

当然ipconfig还有很多其他的用处,比如按照提示上面说的
/all Display full configuration information.
通过/all参数调用,可以显示出全部的设置信息:

C:\Documents and Settingsst>ipconfig /all

Windows IP Configuration

        Host Name . . . . . . . . . . . . : s3049
        Primary Dns Suffix  . . . . . . . :
        Node Type . . . . . . . . . . . . : Unknown
        IP Routing Enabled. . . . . . . . : No
        WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地连接:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : Realtek PCIe GBE Family Controller
        Physical Address. . . . . . . . . : 78-E3-B5-A3-A5-44
        Dhcp Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 172.26.22.49
        Subnet Mask . . . . . . . . . . . : 255.255.0.0
        Default Gateway . . . . . . . . . : 172.26.2.6
        DNS Servers . . . . . . . . . . . : 58.22.96.66

(直接复制了,发图麻烦)

这里可以查看到一些常见的信息,比如host name是主机名,Physical Address 则是传说中的mac地址,IP Address 就是你的本机地址(注意这个通常是局域网下的)。至于后面的子网掩码还有默认网关什么的,想了解的一可以去搜索一下。
还有/flushdns(flush DNS)刷新DNS缓存什么的。相信这些信息,网管专业的同学应该都非常熟悉。(注:不明情况的围观群众不要随意开跳这个坑,了解基本即可。)

ping命令

记得原来微博上面有个吐槽,就是说很多人普通人用百度来搜索,而很多程序员则用百度来测试网络是否联通。那么如果使用ping.exe来测试网络是否联通:

ping www.baidu.com

除了这个用处以外还有一个很常见的作用就是测试自己是否能够连接到某个ip,这里有一个路由器,连接了两台电脑,在每台电脑上都可以通过ipconfig查看自己在局域网中的ip地址,假设对方的ip是192.168.1.106。那么便可以使用ping命令测试是否能联通对方的电脑。

ping 192.168.1.106

当然,眼尖的同学应该已经发现了ping.exe的另一个作用,那就使用获取某个网站的ip地址:

ping www.bilibili.tv

那么,下面的xxx就是B站的ip地址了。

其他闲话

至于
4.快速查询本地服务、端口使用情况
5.快速调用一些常用工具
6.原始编程方式,用cmd调用编译
7.学汇编都应该知道cmd下的debug
8.批处理

这些有的内容对于新手而言略坑,这里暂不做介绍。

其中的5.快速调用一些常用工具,就简单说一下博主常用的工具:
notepad 记事本
calc 计算器
mspaint 画图板
这些实际上通过菜单调出运行(或者win+r)就可以直接输入调出来。

而其中6.原始编程方式,用cmd调用编译,博主原来有发过一篇相关文章:
使用c语言编译器 CL.exe 在cmd下编译C程序

至于批处理,回头会开个新坑,欢迎学习~

c语言入门教程 第12讲 结构体

结构体

可以将多种数据类型组合起来的结构

声明方式

struct 结构体名称{
成员1的类型  成员1的名称;
成员2的类型 成员2的名称;
……
成员3的类型  成员3的名称;
} ;

举例:

struct time{
	int hour;
	int minute;
	int second;
} ;

注意不要漏掉了最后的分号

结构体的定义

1)常规定义

struct time{
	int hour;
	int minute;
	int second;
} ;

struct time t;

如何定义一个int类型的变量?

	int number;

实际上来说,结构体变量的定义是跟普通数据类型类似的。
如,以上两个变量的声明区别,仅在于,一个的类型是struct time 另一个的类型是int

2)声明的同时定义

struct student{
	char name[256];
	char sex[2];
	int age;
	int grade;
} Alan, Tom ;

3)使用结构体作为成员

struct DATE{
	int year;
	int month;
	int day;
} ;

struct person{
	char name[256];
	struct DATE birthday;
} ;

struct time t;

4)匿名结构体

struct {
	int number;
	char name[256];
	char sex[2];
	int age;
	int grade;
} Alan, Tom ;

结构体的引用与初始化

使用“.”成员运算符来获取结构体中的成员

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

struct student{
	int number;
	char name[256];
	char sex[2];
	int age;
	int grade;
} ;

main()
{
	struct student alan;
	alan.number = 001;
	strcpy(alan.name, "Allan");
	strcpy(alan.sex, "男");
	alan.age = 18;
	alan.grade = 3;

	printf("学号:%d n姓名: %s n性别:%s n年龄:%dn年级:%dn", 
		   alan.number, alan.name, alan.sex, alan.age, alan.grade);
}

结构体数组

结构体数组的使用:

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

struct student{
	int number;
	char name[256];
	int age;
} ;

main()
{
	struct student class_02[5];
	int k;

	for(k=0; k < 5; k++)
	{
		printf("Please input number:n");
		scanf("%d", &class_02[k] .number);
		printf("Please input name:n");
		scanf("%s", class_02[k] .name);

		printf("Please input age:n");
		scanf("%d", &class_02[k] .age);

		printf("n");
	}

	printf("NumtNametagen");

	for(k=0; k < 5; k++)
	{
		printf("%dt", class_02[k] .number);
		printf("%st", class_02[k] .name);
		printf("%dn", class_02[k] .age);
	}
}
#include<stdio.h>

struct student{
	int number;
	char name[256];
	char sex[6];
	int age;
	int grade;
} ;

main()
{
	struct student class1[5] = {
		{ 01, "Alan", "man", 16, 12 },
		{ 02, "Bob", "man", 18, 12 },
		{ 03, "Cici", "woman", 16, 12 },
		{ 04, "David", "man", 11, 12 },
		{ 05, "Elis", "woman", 16, 12 },
	};
	for(k = 0; k < 5; k++)
	{
		printf("nstudy number: %d nname: %s nsex: %s nage: %dn grade: %dn" ,class1[k].number,
		class1[k].name,
		class1[k].sex,
		class1[k].age,
		class1[k].grade);
	}
}

结构体指针

使用分量运算符“->”来获取成员

#include<stdio.h>

struct DATE{
	int year;
	int month;
	int day;
} *date ;

main()
{
	date->year = 2012;
	printf("%d", date->year);
}

#include<stdio.h>

struct DATE{
	int year;
	int month;
	int day;
} date = { 2012, 11, 27 }, *d ;

main()
{
	d = &date;
	printf("%d", d->year);
}

用于函数的参数以及返回值:

#include<stdio.h>

struct time add(struct time now, struct time pass);

struct time{
	int hour;
	int min;
} ;

main()
{
	struct time now = { 3, 55 }, pass = { 1, 33 }, result;
	result = add(now, pass);
	printf("%d:%dn", result.hour, result.min);
}

struct time add(struct time now, struct time pass)
{
	struct time rel;
	rel.hour = now.hour + pass.hour + (now.min + pass.min)/60 ;
	rel.min = (now.min + pass.min)%60;
	return rel;
}

c语言入门教程 第11讲 调试以及资料收集

视频地址

A站:http://www.acfun.tv/v/ac479828
B站:http://www.bilibili.tv/video/av400594/
新浪:http://video.sina.com.cn/v/b/90825190-2731231323.html

如何进行调试

1)注释调试
2)printf打印调试
3)根据报错信息找错
4)使用调试工具
5)求助网络

查询文档

1.右键查看定义
2.度娘谷歌
3.手册
4.自己撰写自己的文档

如何查看函数以及变量的引用?
使用工具自带的功能。

如何查看函数的使用方法?
度娘谷歌等,vs下可按F1查看微软的帮助文档

基础的东西学完了如果知道下一步学什么?
通过相关的书籍、论坛帖子或者博客博文

提高自己的查找能力

查询:
http://www.baidu.com/               度娘
http://www.google.com.hk/        谷歌
http://msdn.microsoft.com/        MSDN

百度知道、各大博客论坛的搜索功能

资料网站:
http://www.verycd.com                电驴
http://www.51cto.com                  51CTO
http://club.topsage.com/               大家网
http://www.oschina.net/             开源中国

论坛:
http://bbs.chinaunix.net/            ChinaUnix论坛
http://bbs.51cto.com/                51cto论坛
http://www.itpub.net/                 itpub论坛
http://bbs.pediy.com/                 看雪学院
http://www.cctry.com/               vc驿站
http://bbs.fishc.com/                  鱼C论坛
http://bbs.bccn.net/                   编程论坛
http://www.rupeng.com/                   如鹏网

技术博客聚集区:
http://blogs.msdn.com/              MSDN博客
http://www.cnblogs.com/           博客园
http://blog.51cto.com/               51cto博客
http://www.iteye.com/blogs        iteye博客
http://space.itpub.net/                itpub博客
http://wo.zdnet.com.cn/             ZDNet技术社区
http://www.oschina.net/blog             开源中国

英文网站:
http://sourceforge.net/
http://www.cplusplus.com
http://www.codeguru.com/
http://www.codeproject.com/

书籍教程推荐

《C语言自学教程》郝斌
《数据结构自学视频》郝斌
《C Primer Plus》中文版
《C语言程序设计 现代方法》
《狂人C-程序员入门必备》
《C和指针》人民邮电出版社
《C语言实例解析精粹》曹衍龙

如何学习?

1.理解编程过程中的知识点
2.使用自己理解知识去编程、在编程的过程中验证所学
3.尝试去寻找题目编写
4.在调试中寻找自己的不足
5.阅读好的书籍,查漏补缺(可搜索笔记)

小结

1.调试的基本方法
2.去哪里找资料?
3.如何学习比较好?

如果有发现不错的网站或者资料可以向博主推荐
特别是各个博客区中比较好的博客
后期还会再排版,汇总推荐

C/C++ Beginner 一群 10191598
C/C++ Beginner 二群 163859361 (感谢One day捐助)
C/C++ Beginner 三群 10366953 (感谢Vol jun捐助)

c语言入门教程 第12讲 结构体

c语言入门教程 第10讲 字符串处理

字符与字符串的区别

1)符号

字符	' ' 单引号
字符串	" " 双引号

2)内容

字符	单个字符
字符串	多个字符

3)输入输出格式

字符	%c
字符串	%s

4)标识

字符串	'\0'做结尾

字符串的本质是?

字符串本质上就是一个字符数组

“hello world” 这样的字符串,就是包含其中各个元素的,并且结尾为”的一个一维字符数组

如:

char hi[12]={'H','e','l','l','o',' ','w','o','r','l','d','\0'};

因为一个字符串要有”作为结尾
所以字符数组的长度要比本身字符数目多一个

如上例中,字符串有11个,但是字符数组长度要达到12

字符串的定义与初始化

字符串面量:
“Hello world” 注意:字面量(双引号引起来的)是常量

区别举例:

"Alan"  常量
char name[20] = "Jack";   // "Jack"是字面量 是常量  name是字符数组, 是变量

注:
常量不能被赋值,如讲2的值赋给1这样:

1 = 2 是不行的,1是常量不能被赋值

“string” 这样的字符串也是不能被赋值的:

"string" = "Hello Jack" 这样是错的

字符数组

1)数组形式

char hi[3]={'H', 'i','\0'};
char hello[]={'H','e','l','l','o',' ','w','o','r','l','d','\0'};

2)直接赋首地址

char shool[20] = "第一中学";

3)省略长度

char name1[] = "Alan";
char name2[] = { "Alan" };

字符指针

char *name3  = "Alan";
char *s = "第一中学";

思考:
指针能不能直接赋给数组?

字符串的遍历

char hi[] = "I am happy" ;

1.for循环遍历

for(i=0; i<11; i++)
{
    printf("%c", hi);
}

2.直接输出

printf(hi);

3.字符串格式(%s)输出

printf("%s", hi);

字符串数组(二维字符数组)

常见姓名:

char name1[] = "张三";
char name2[] = "李四";
char name3[] = "王五";

存储多个字符串:

1)二维数组

char name[][256] = { "张三", "李四", "王五" };

2)一维指针数组

char *name[] = { "张三", "李四", "王五" };

对于printf,最重要的是?

对于printf和scanf来说,字符串最重要的是其起始地址

如打印一个字符串:

char *text = "hey gays!";

1) pirntf(text);
2) printf("%s", text);

对于printf这个函数而言,只要知道字符串开头的地址,
那么就一直打印下去,一直到碰到”的时候停止

如:

printf("Hello \0 world"); \ hello 

常见的字符串操作函数

stdio.h

输入:scanf()、gets()、getchar()
输出:printf()、puts()、putchar()

string.h

连接:strcat()
拷贝:strcpy()
比较:strcmp()
获取长度:strlen()
大小写转换:strupr()、strlwr()
拼接字符串:sprintf()

示例:

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

main()
{
    char *hi = "hello", s2 = "Alice";
    char str[256], *pstr;
    printf("%s n", strcat(hi, " world"));//连接
    printf("%s n", strcpy(str, "come on")); //拷贝
    printf("%s n", strcmp("你好", "你好")); //比较
    printf("%s n", strlen(str)); //获取长度
    printf("%s n", strupr(str)); //转成大写
}

学会查询文档:

1.右键查看定义
2.度娘谷歌
3.手册
4.自己撰写自己的文档

关于函数传参数

对于:int add(int a, int b);
调用:add(5, 10);

add函数中参数初始化时,相当于:
int a = 5;  int b = 10

对于:int swap(int *x, int *y);
调用:swap(&i, &j);

swap函数中参数初始化时 ,相当与:
int *x = &i;  int *y = &j;

strlen()

#include<stdio.h>
int mylength(char *aim);

int main()
{
    char *str1 = "hello ";
    printf("%dn", mylength(str1));
}

int mylength(char *aim)
{
    int count=0;
    while(*aim++){
    count++;
    }
    return count;
}

strcat()

#include<stdio.h>
char * mycat(char *dest, char *src);

int main()
{
	char str1[20] = "hello "; // 要拷贝的话需要有足够的内存
	char *str2 = "world";
	printf("%sn", mycat(str1, str2));
}

char *mycat(char *dest, const char *src)
{
	char *address = dest;

	while (*++dest) // 加到 '\0' 马上停止
		;

	while (*dest++ = *src++)
		;

	return address;
}

(感谢 灬蕾依丽雅 君的提醒, 该函数已修正)

本讲小结

一、字符串的本质,与字符的区别
1)本质上是结尾为”字符数组
2)单双引号,书写区别
3)输出格式”%c”和”%s”

二、字符串的定义与初始化
1)字面量
2)数组
3)指针

三、常见的字符串操作,及其操作的实现
连接(strcat)、拷贝(strcpy)、比较(strcmp)、获取长度(strlen)、大小写转换(strupr、strlwr)、拼接字符串(sprintf)

以上部分函数的实现跨越在博主的 string.h 的实现中找到 博主的 C标准库

课后作业

通过自己查找参考,理解并实现以上常见的字符串操作
注:sprintf()只要掌握,不要求实现

c语言入门教程 第11讲 调试以及资料收集