C语言程序设计 学习笔记 字符串(II)(字符串输入输出,字符串数组,程序参数)

字符串输入输出:

char str[8];
scanf("%s",&str);
printf("%s",str);

scanf表示读入一个单词(到空格、tab、回车为止)
scanf是不安全的,因为这样不知道要读入的内容的长度,在一些情况中会出现问题:

#include
void f(){
	char s1[8];
	char s2[8];
	scanf("%s",&s1);
	scanf("%s",&s2);
	printf("s1 = %s\ns2 = %s",s1,s2);
}
int main(){
	f(); 
	
	return 0;
} 

理论上,输入超过8的字符串会报错
(翁恺的视频中会报错,但我自己用dev-c++就不会出现这类问题……)

安全的方法:
建议对字符串输入时,限制其输入长度,如:

scanf("%6s",&s1);

限制我输入的字符串输入长度最长为6,如果有结束标志(TAB、空格、回车)同样会直接结束,结果会为:

1234567654 345
s1 = 123456
s2 = 7654

12345 234565432
s1 = 12345
s2 = 234565432

空字符串:

char buffer[100] = "";

这是一个空字符串,此时buffer[0] == ‘\0’

char buffer[] = "";

如此定义的话,buffer的长度是1,不能起到创建一个空字符串的作用

字符串数组:

可能会有两种猜想字符串数组的定义:

char **a;

a是一个指针,指向另一个指针,这个(另一个指针)指向一个字符(串),所以这并不是想要的字符串数组

char a[][];

这是一个二维数组,讲道理应该是字符串数组的样子,但实际上它对长度非常有限制:

#include
void f(){
	char a[][] = {
		"Hello",
		"hahah"
	};
}
int main(){
	f(); 
	
	return 0;
} 

首先,会报错,因为列必须要有一个确定的数字
char a[][] 改成char a[][10]后,成功执行,但是这时候我们定义的行长度为固定的,就像是const char a[] = “Hello”,固定为6(有一个\0),所以如果将这里面的元素改成

	char a[][] = {
		"Hello",
		"hahahaha"
	};

系统会报错
(翁恺的编译器会出问题,我用的并不会……但出于安全考虑,不建议这样定义字符串数组)

在此提供一个正确的写法:

char *a[];

此时将其替换后便是最安全的字符串数组定义方法

char a[][10] 和 char *a[]的区别:

char a[][10]是开辟了一个n行10列的矩阵,然后每行存有数据,如下图:
C语言程序设计 学习笔记 字符串(II)(字符串输入输出,字符串数组,程序参数)_第1张图片

char *a[]可以理解为指针数组,a[0]指向一个字符串(如“hello\0”),a[1]指向另一个字符串(如“li\0”),如下图:
C语言程序设计 学习笔记 字符串(II)(字符串输入输出,字符串数组,程序参数)_第2张图片
因此这两个是不等值的,出于安全考虑,建议使用后者

程序参数
默认的main函数是

int main(int argc,char const *argv[])

argc是指后面数组的大小(size)
argv[0]是命令本身,当使用unix的符号链接时,会反映符号链接的名字
对于这个字符串,可以通过代码呈现出来:

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

后续内容建议看视频,需要linux系统,windows不好实现
翁恺 程序设计入门 程序参数

你可能感兴趣的:(学习笔记)