扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
C语言sscanf函数的总结
成都创新互联公司是一家专业提供邻水企业网站建设,专注与成都网站制作、成都做网站、H5开发、小程序制作等业务。10年已为邻水众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
在处理字符串的程序当中,经常会分析字符串,从一大长串的字符串截取我们需要的数据,这如果通过自己手写函数来分析,虽然可以,但当你知道sscanf的功能,那就自己写函数分析就显得多此一举。
这些函数的使用都很简单,总结一下,等下次使用一目了然。俗话说:好记性不如烂笔头,记录下来就是效率。
以下源代码是本人测试的源文件,附带讲解注释。
1./*****************************************************
2.** Name : sscanf.c
3.** Author : gzshun
4.** Version : 1.0
5.** Date : 2011-12
6.** Description : sscanf function
7.******************************************************/
8.#include stdio.h
9.#include stdlib.h
10.#include string.h
11.
12.static void sscanf_test(void);
13.
14.static void sscanf_test(void)
15.{
16. int ret;
17. char *string;
18. int digit;
19. char buf1[255];
20. char buf2[255];
21. char buf3[255];
22. char buf4[255];
23.
24. /*1.最简单的用法*/
25. string = "china beijing 123";
26. ret = sscanf(string, "%s %s %d", buf1, buf2, digit);
27. printf("1.string=%s\n", string);
28. printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit);
29. /*
30. **执行结果:
31. **1.ret=2, buf1=china, buf2=beijing, digit=123
32. **可以看出,sscanf的返回值是读取的参数个数
33. */
34.
35. /*2.取指定长度的字符串*/
36. string = "123456789";
37. sscanf(string, "%5s", buf1);
38. printf("2.string=%s\n", string);
39. printf("2.buf1=%s\n\n", buf1);
40. /*
41. **执行结果:
42. **2.buf1=12345
43. */
44.
45. /*3.取到指定字符为止的字符串*/
46. string = "123/456";
47. sscanf(string, "%[^/]", buf1);
48. printf("3.string=%s\n", string);
49. printf("3.buf1=%s\n\n", buf1);
50. /*
51. **执行结果:
52. **3.buf1=123
53. */
54.
55. /*4.取到指定字符集为止的字符串*/
56. string = "123abcABC";
57. sscanf(string, "%[^A-Z]", buf1);
58. printf("4.string=%s\n", string);
59. printf("4.buf1=%s\n\n", buf1);
60. /*
61. **执行结果:
62. **4.buf1=123abc
63. */
64.
65. /*5.取仅包含指定字符集的字符串*/
66. string = "0123abcABC";
67. sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);
68. printf("5.string=%s\n", string);
69. printf("5.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);
70. /*
71. **执行结果:
72. **5.buf1=123
73. */
74.
75. /*6.获取指定字符中间的字符串*/
76. string = "iosAndroidwp7";
77. sscanf(string, "%*[^]%[^]", buf1);
78. printf("6.string=%s\n", string);
79. printf("6.buf1=%s\n\n", buf1);
80. /*
81. **执行结果:
82. **6.buf1=android
83. */
84.
85. /*7.指定要跳过的字符串*/
86. string = "iosVSandroid";
87. sscanf(string, "%[a-z]VS%[a-z]", buf1, buf2);
88. printf("7.string=%s\n", string);
89. printf("7.buf1=%s, buf2=%s\n\n", buf1, buf2);
90. /*
91. **执行结果:
92. **7.buf1=ios, buf2=android
93. */
94.
95. /*8.分割以某字符隔开的字符串*/
96. string = "android-iphone-wp7";
97. /*
98. **字符串取道'-'为止,后面还需要跟着分隔符'-',
99. **起到过滤作用,有点类似于第7点
100. */
101. sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3);
102. printf("8.string=%s\n", string);
103. printf("8.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);
104. /*
105. **执行结果:
106. **8.buf1=android, buf2=iphone, buf3=wp7
107. */
108.
109. /*9.提取邮箱地址*/
110. string = "Email:beijing@sina.com.cn";
111. sscanf(string, "%[^:]:%[^@]@%[^.].%s", buf1, buf2, buf3, buf4);
112. printf("9.string=%s\n", string);
113. printf("9.buf1=%s, buf2=%s, buf3=%s, buf4=%s\n\n", buf1, buf2, buf3, buf4);
114. /*
115. **执行结果:
116. **9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn
117. */
118.}
119.
120.int main(int argc, char **argv)
121.{
122. sscanf_test();
123.
124. return 0;
125.}
126.
127./*
128.**测试程序
129.**环境:
130.**Linux Ubuntu 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux
131.**gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
132.**
133.gzshun@ubuntu:~/c/sscanf$ gcc sscanf.c -o sscanf
134.gzshun@ubuntu:~/c/sscanf$ ./sscanf
135.1.string=china beijing 123
136.1.ret=3, buf1=china, buf2=beijing, digit=123
137.
138.2.string=123456789
139.2.buf1=12345
140.
141.3.string=123/456
142.3.buf1=123
143.
144.4.string=123abcABC
145.4.buf1=123abc
146.
147.5.string=0123abcABC
148.5.buf1=0123, buf2=abc, buf3=ABC
149.
150.6.string=iosandroidwp7
151.6.buf1=android
152.
153.7.string=iosVSandroid
154.7.buf1=ios, buf2=android
155.
156.8.string=android-iphone-wp7
157.8.buf1=android, buf2=iphone, buf3=wp7
158.
159.9.string=Email:beijing@sina.com.cn
160.9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn
161.*/
本篇文章来源于 Linux公社网站() 原文链接:
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C 语言string的用法有哪些呢,请看看下面我为你整理 总结 的c语言string的用法大全_C语言中string使用 方法 。
c语言string的用法
函数原型:char *strdup(const char *s)
函数功能:字符串拷贝,目的空间由该函数分配
函数返回:指向拷贝后的字符串指针
参数说明:src-待拷贝的源字符串
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
#includealloc.h
intmain()
{
char*dup_str,*string="abcde";
dup_str=strdup(string);
printf("%s",dup_str);
free(dup_str);
return0;
}
@函数名称:strcpy
函数原型:char* strcpy(char* str1,char* str2);
函数功能:把str2指向的字符串拷贝到str1中去
函数返回:返回str1,即指向str1的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[10];
char*str1="abcdefghi";
strcpy(string,str1);
printf("thestringis:%s\n",string);
return0;
}
@函数名称:strncpy
函数原型:char *strncpy(char *dest, const char *src,intcount)
函数功能:将字符串src中的count个字符拷贝到字符串dest中去
函数返回:指向dest的指针
参数说明:dest-目的字符串,src-源字符串,count-拷贝的字符个数
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*src="bbbbbbbbbbbbbbbbbbbb";//20'b's
chardest[50]="aaaaaaaaaaaaaaaaaaaa";//20'a's
puts(dest);
strncpy(dest,src,10);
puts(dest);
return0;
}
输出:
[cpp] view plain
/*******************************************
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbaaaaaaaaaa
*******************************************/
注意:strncpy只复制指定长度的字符,不会自动在末尾加'\0'。若指定长度超过源字符串长度,不够的部分补‘\0’,
@函数名称:strcat
函数原型:char* strcat(char * str1,char * str2);
函数功能:把字符串str2接到str1后面,str1最后的'\0'被取消
函数返回:str1
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charbuffer[80];
strcpy(buffer,"Hello");
strcat(buffer,"world");
printf("%s\n",buffer);
return0;
}
@函数名称:strncat
函数原型:char *strncat(char *dest, const char *src, size_t maxlen)
函数功能:将字符串src中前maxlen个字符连接到dest中
函数返回:
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
charbuffer[80];
intmain()
{
strcpy(buffer,"Hello");
strncat(buffer,"world",8);
printf("%s\n",buffer);
strncat(buffer,"*************",4);
printf("%s\n",buffer);
return0;
}
注意:与strncpy不同的是,strncat会自动在末尾加‘\0’,若指定长度超过源字符串长度,则只复制源字符串长度即停止
@函数名称:strcmp
函数原型:int strcmp(char * str1,char * str2);
函数功能:比较两个字符串str1,str2.
函数返回:str1str2,返回负数;str1=str2,返回 0;str1str2,返回正数.
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*buf1="aaa",*buf2="bbb",*buf3="ccc";
intptr;
ptr=strcmp(buf2,buf1);
if(ptr0)
printf("buffer2isgreaterthanbuffer1\n");
else
printf("buffer2islessthanbuffer1\n");
ptr=strcmp(buf2,buf3);
if(ptr0)
printf("buffer2isgreaterthanbuffer3\n");
else
printf("buffer2islessthanbuffer3\n");
return0;
}
@函数名称:strncmp
函数原型:int strncmp(char *str1,char *str2,int count)
函数功能:对str1和str2中的前count个字符按字典顺序比较
函数返回:小于0:str1str2,等于0:str1=str2,大于0:str1str2
参数说明:str1,str2-待比较的字符串,count-比较的长度
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charstr1[]="aabbc";//
charstr2[]="abbcd";//
//为使测试程序更简练,此处假定了strncmp只返回-1,0,1三个数
charres_info[]={'','=',''};
intres;
//前1个字符比较
res=strncmp(str1,str2,1);
printf("1:str1%cstr2\n",res_info[res+1]);
//前3个字符比较
res=strncmp(str1,str2,3);
printf("3:str1%cstr2\n",res_info[res+1]);
}
输出:
[cpp] view plain
/****************************************
1:str1=str2
3:str1str2
*****************************************/
@函数名称:strpbrk
函数原型:char *strpbrk(const char *s1, const char *s2)
函数功能:得到s1中第一个“同时也出现在s2中”字符的位置指针
函数返回:位置指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*p="Findallvowels";
p=strpbrk(p+1,"aeiouAEIOU");
while(p)
{
printf("%s\n",p);
p=strpbrk(p+1,"aeiouAEIOU");
}
return0;
}
输出:
[cpp] view plain
/**************************************
indallvowels
allvowels
owels
els
**************************************/
@函数名称:strcspn
函数原型:int strcspn(const char *s1, const char *s2)
函数功能:统计s1中从头开始直到第一个“来自s2中的字符”出现的长度
函数返回:长度
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
printf("%d\n",strcspn("abcbcadef","cba"));
printf("%d\n",strcspn("xxxbcadef","cba"));
printf("%d\n",strcspn("123456789","cba"));
return0;
}
输出:
[cpp] view plain
/************************
3
9
************************/
@函数名称:strspn
函数原型:int strspn(const char *s1, const char *s2)
函数功能:统计s1中从头开始直到第一个“不来自s2中的字符”出现的长度
函数返回:位置指针
参数说明:
所属文件:string.h
[html] view plain
#includestdio.h
#includestring.h
#includealloc.h
intmain()
{
printf("%d\n",strspn("abcbcadef","cba"));
printf("%d\n",strspn("xxxbcadef","cba"));
printf("%d\n",strspn("123456789","cba"));
return0;
}
输出:
[cpp] view plain
/************************
6
************************/
@函数名称:strchr
函数原型:char* strchr(char* str,char ch);
函数功能:找出str指向的字符串中第一次出现字符ch的位置
函数返回:返回指向该位置的指针,如找不到,则返回空指针
参数说明:str-待搜索的字符串,ch-查找的字符
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*str="Thisisastring!";
charch;
char*p;
while(1)
{
printf("Pleaseinputachar:");
ch=getchar();
p=strchr(str,ch);
if(p)
printf("%cisthe%dcharacterof\"%s\"\n",ch,(int)(p-str+1),str);
else
printf("Notfound!\n");
printf("PressESCtoquit!\n\n");
if(27==getch())
break;
fflush(stdin);
}
return0;
}
运行结果:
[cpp] view plain
/********************************************
Pleaseinputachar:i
iisthe3characterof"Thisisastring!"
PressESCtoquit!
Pleaseinputachar:l
Notfound!
PressESCtoquit!
Pleaseinputachar:s
sisthe4characterof"Thisisastring!"
PressESCtoquit!
**********************************************/
@函数名称:strrchr
函数原型:char *strrchr(const char *s, int c)
函数功能:得到字符串s中最后一个含有c字符的位置指针
函数返回:位置指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charstring[15];
char*ptr,c='r';
strcpy(string,"Thisisastring");
ptr=strrchr(string,c);
if(ptr)
printf("Thecharacter%cisatposition:%d",c,ptr-string);
else
printf("Thecharacterwasnotfound");
return0;
}
@函数名称:strstr
函数原型:char* strstr(char* str1,char* str2);
函数功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)
函数返回:返回该位置的指针,如找不到,返回空指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*str1="OpenWatcomC/C++",*str2="Watcom",*ptr;
ptr=strstr(str1,str2);
printf("Thesubstringis:%s\n",ptr);
return0;
}
输出:
The substringis:Watcom C/C++
@函数名称:strrev
函数原型:char *strrev(char *s)
函数功能:将字符串中的所有字符颠倒次序排列
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charforward[]="string";//原文中定义为char*是不对的,指向代码段的指针内容是不可变的
printf("Beforestrrev():%s",forward);
strrev(forward);
printf("Afterstrrev():%s",forward);
return0;
}
输出:
[cpp] view plain
/************************************
Beforestrrev():string
Afterstrrev():gnirts
************************************/
@函数名称:strnset
函数原型:char *strnset(char *s, int ch, size_t n)
函数功能:将字符串s中前n个字符设置为ch的值
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[]="aaaaaaaaaaaaaaaaaaaaaaa";
charletter='x';
printf("stringbeforestrnset:%s\n",string);
strnset(string,letter,10);
printf("stringafterstrnset:%s\n",string);
return0;
}
输出:
[cpp] view plain
/*************************************************
stringbeforestrnset:aaaaaaaaaaaaaaaaaaaaaaa
stringafterstrnset:xxxxxxxxxxaaaaaaaaaaaaa
*************************************************/
@函数名称:strset
函数原型:char *strset(char *s, int ch)
函数功能:将字符串s中所有字符设置为ch的值
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[10]="123456789";
charsymbol='c';
printf("Beforestrset():%s",string);
strset(string,symbol);
printf("Afterstrset():%s",string);
return0;
}
@函数名称:strtok
函数原型:char *strtok(char *s1, const char *s2)
函数功能:分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词)
函数返回:字符串s1中首次出现s2中的字符前的子字符串指针
参数说明:s2一般设置为s1中的分隔字符
规定进行子调用时(即分割s1的第二、三及后续子串)第一参数必须是NULL
在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘下链中第一个环),因此s1被破坏了
函数会记忆指针位置以供下一次调用
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*p;
char*buffer;
char*delims={".,"};
buffer=strdup("Findwords,allofthem.");
printf("%s\n",buffer);
p=strtok(buffer,delims);
while(p!=NULL){
printf("word:%s\n",p);
p=strtok(NULL,delims);
}
printf("%s\n",buffer);
return0;
}//根据测试,可以随时给strtok的第一个参数输入一个新的字符串,开始新字符串的分隔
PS:根据测试,可以随时给strtok的第一个参数输入一个新的字符串,开始新字符串的分隔
@函数名称:strupr
函数原型:char *strupr(char *s)
函数功能:将字符串s中的字符变为大写
函数返回:
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[]="abcdefghijklmnopqrstuvwxyz",*ptr;//会影响原字符串的内存,用char[]来声明
ptr=strupr(string);
printf("%s",ptr);
return0;
}
@函数名称:strlwr
函数原型:char *strlwr(char *s)
函数功能:将字符串中的字符变为小写字符
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
intmain()
{
charstr[]="HOWTOSAY";
printf("%s",strlwr(str));
return0;
}
@函数名称:strerror
函数原型:char *strerror(int errnum)
函数功能:得到错误信息的内容信息
函数返回:错误提示信息字符串指针
参数说明:errnum-错误编号
所属文件:string.h
[cpp] view plain
#includestdio.h
#includeerrno.h
intmain()
{
char*buffer;
buffer=strerror(errno);
printf("Error:%s",buffer);
return0;
}
@函数名称:memcpy
函数原型:void *memcpy(void *dest, const void *src, size_t n)
函数功能:字符串拷贝
函数返回:指向dest的指针
参数说明:src-源字符串,n-拷贝的最大长度
所属文件:string.h,mem.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charsrc[]="******************************";
chardest[]="abcdefghijlkmnopqrstuvwxyz0123456709";
char*ptr;
printf("destinationbeforememcpy:%s\n",dest);
ptr=memcpy(dest,src,strlen(src));
if(ptr)
printf("destinationaftermemcpy:%s\n",dest);
else
printf("memcpyfailed");
return0;
}
输出:
[cpp] view plain
/*************************************************************
destinationbeforememcpy:abcdefghijlkmnopqrstuvwxyz0123456709
destinationaftermemcpy:******************************456709
**************************************************************/
@函数名称:memccpy
函数原型:void *memccpy(void *dest, const void *src, int c, size_t n)
函数功能:字符串拷贝,到指定长度或遇到指定字符时停止拷贝
函数返回:
参数说明:src-源字符串指针,c-中止拷贝检查字符,n-长度,dest-拷贝底目的字符串指针
所属文件:string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*src="Thisisthesourcestring";
chardest[50];
char*ptr;
ptr=memccpy(dest,src,'c',strlen(src));
if(ptr)
{
*ptr='\0';
printf("Thecharacterwasfound:%s",dest);
}
else
printf("Thecharacterwasn'tfound");
return0;
}
输出:
[cpp] view plain
/*****************************************
Thecharacterwasfound:Thisisthesourc
*****************************************/
PS:指定字符被复制到dest中,memccpy返回了dest中指定字符的下一处的地址,返回NULL表示未遇到指定字符
@函数名称:memchr
函数原型:void *memchr(const void *s, int c, size_t n)
函数功能:在字符串中第开始n个字符中寻找某个字符c的位置
函数返回:返回c的位置指针,返回NULL时表示未找到
参数说明:s-要搜索的字符串,c-要寻找的字符,n-指定长度
所属文件:string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charstr[17];
char*ptr;
strcpy(str,"Thisisastring");
ptr=memchr(str,'r',strlen(str));
if(ptr)
printf("Thecharacter'r'isatposition:%d",ptr-str);
else
printf("Thecharacterwasnotfound");
return0;
}
@函数名称:memcmp
函数原型:int memcmp(const void *s1, const void *s2,size_t n)
函数功能:按字典顺序比较两个串s1和s2的前n个字节
函数返回:0,=0,0分别表示s1,=,s2
参数说明:s1,s2-要比较的字符串,n-比较的长度
所属文件:string.h,mem.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*buf1="ABCDE123";
char*buf2="abcde456";
intstat;
stat=memcmp(buf1,buf2,5);
printf("Thestringstoposition5are");
if(stat)printf("not");
printf("thesame\n");
return0;
}
@函数名称:memicmp
函数原型:int memicmp(const void *s1, const void *s2, size_t n)
函数功能:按字典顺序、不考虑字母大小写对字符串s1,s2前n个字符比较
函数返回:0,=0,0分别表示s1,=,s2
参数说明:s1,s2-要比较的字符串,n-比较的长度
所属文件:string.h,mem.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*buf1="ABCDE123";
char*buf2="abcde456";
intstat;
stat=memicmp(buf1,buf2,5);
printf("Thestringstoposition5are");
if(stat)printf("not");
printf("thesame");
return0;
}
输出:
[cpp] view plain
/**************************************
Thestringstoposition5arethesame
***************************************/
@函数名称:memmove
函数原型:void *memmove(void *dest, const void *src, size_t n)
函数功能:字符串拷贝
函数返回:指向dest的指针
参数说明:src-源字符串,n-拷贝的最大长度
所属文件:string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
chardest[40]="abcdefghijklmnopqrstuvwxyz0123456789";
printf("destinationpriortomemmove:%s\n",dest);
memmove(dest+1,dest,35);
printf("destinationaftermemmove:%s",dest);
return0;
}
PS:与memcpy不同的是,memmove可以处理目的字符串与源字符串地址空间出现重叠的情况,可保证待复制的内容不被破坏。
@函数名称: memset
函数原型: void *memset(void *s, int c, size_t n)
函数功能: 字符串中的n个字节内容设置为c
函数返回:
参数说明: s-要设置的字符串,c-设置的内容,n-长度
所属文件: string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
#includemem.h
intmain()
{
charbuffer[]="Helloworld";
printf("Bufferbeforememset:%s/n",buffer);
memset(buffer,'*',strlen(buffer)-1);
printf("Bufferaftermemset:%s",buffer);
return0;
}
c语言string的用法大全相关 文章 :
★ c语言string的用法
★ c语言的用法
★ Linux C语言字符与字符串处理
★ c语言中strcmp的用法
★ c语言大括号的用法
★ c语言位运算符的用法
★ c语言char的用法
★ c语言中sort的用法详解
★ c语言中int的用法
★ c语言map的用法
argc和argv是main函数的形式参数。这两个形式参数的类型是系统规定的。如果main函数要带参数,就是这两个类型的参数;否则main函数就没有参数。
坚持使用标准的意义在于:当你把程序从一个编译器移到另一个编译器时,照样能正常运行。
由于是 int main( ..) 那么当时 应当返回 int 但是return 2.3 ;也能运行正确,这是因为编译器自动转换2.3为int,截断后为return 2;
如果写为 return "abc";那么会报错, error C2440: “return”: 无法从“const char [4]”转换为“int”。
变量名称argc和argv是常规的名称,当然也可以换成其他名称。那么,实际参数是如何传递给main函数的argc和argv的呢?我们知道,C程序在编译和链接后,都生成一个可执行文件。也可以在命令行下带参数执行,命令行执行的形式为:可执行文件名称 参数1 参数2 ... ... 参数n。可执行文件名称和参数、参数之间均使用空格隔开。
如果按照这种方法执行,命令行字符串将作为实际参数传递给main函数。具体为:
(1) 可执行文件名称和所有参数的个数之和传递给argc;
(2) 可执行文件名称(包括路径名称)作为一个字符串,首地址被赋给argv[0],参数1也作为一个字符串,首地址被赋给argv[1],... ...依次类推。
字符串arav[i](i=1,...argc-1)表式第 i 个程序参数,标准C 要求argv[argc]是个null指针,但在有些旧时编译器中却不是这样的,argv向量以及它所指向的字符串必须是可以修改的,并且他们的值在程序执行期间不能被编译器或操作系统所修改。如果编译器并不允许大小写混合的字符串 ,则存储在argv中的字符串必须采用小写形式。
1.给main函数传递参数只有一种方式,即main(int argc, char *argv[])。第一个参数必须int,第二个(如果有的话)必须是char**或char *argv[]。
2.argc代表传入参数的个数,argv是一个数组,每个元素都是一个char *。字符串arav[i](i=1,...argc-1)表式第 i 个程序参数,标准C 要求argv[argc]是个null指针。
3.main函数参数理论上支持“无数”个,且参数在进程内支持修改。
c语言概要
第一章、 概述
1、 c语言的基本知识
1.1、 c语言的执行步骤
编辑-程序代码的录入,生成源程序*.c
编译-语法分析查错,翻译生成目标程序*.obj
(语法或逻辑错误,从第一个开始改,变量定义,语句格式,表达式格式等)
链接-与其他目标程序或库链接装配,生成可执行程序*.exe
执行
1.2、 main函数的基本知识
main()函数的位置
c程序总是从main( )函数开始执行
一个c程序可以包含一个主函数,即main()函数;也可以包含一个main()函数和若干其它函数
1.3、 c程序的结构
函数与主函数
程序由一个或多个函数组成
必须有一个且只能有一个主函数main()
程序执行从main开始,在main中结束,其他函数通过嵌套调用得以执行
程序语句
C程序由语句组成
用“;”作为语句终止符
注释
//
或
/* */ 为注释,不能嵌套
不产生编译代码
1.4、c 程序书写的规则
习惯用小写字母,大小写敏感
不使用行号,无程序行概念:通常一个语句占一行
可使用空行和空格
常用锯齿形的书写格式;同一层次结构的语句上下对齐。
第二章、基本数据类型与运算
2.1、c程序的数据类型
注意类型和变量含义的不同(类型是固定好的名字,变量是自己起的名字)
变量占用的存储空间
数据类型
基本类型:整型、字符型、浮点型(单精度型,双精度型)
构造类型:数组类型、结构体类型
指针类型
空类型
注意基本类型赋初值的方式
基本数据类型的表示形式
整形数据
十进制:以非0数字开头,如:123,-9,0
八进制;以0数字开头,如:0123,067
十六进制:以0x开头,如:0x123,0xff
实型数据
十进制:必须带小数点,如:123.0,-9.0
指数形式;如:1.23E3,0.9e-2,5e2
字符型数据
普通字符:如:’a’,’2’,’H’,’#’
转义字符:如:’\n’,’\167’,’\xlf,’\\’
(实现几列的对齐:指定宽度。如%100\ ‘\t’制表位)
(字符串长度。“abc\n\t\\” strlen 6; sizeof 7)
基本数据类型的存储长度
整型
Int 字节数 2 位数 16 数的表示范围 -32768—32767
Short 2 16 -32768—32767
Long 4 32 -2147483648—2147483647
实型
Float 4 32 3.4e-38---3.4e38
Double 8 64 1.7e-308---1.7e308
字符型
Char 1 8 -128----127
2.2、标识符命名规则
C语言标志符命名规则
标识符有数字,字母,下划线组成
标识符的首字符必须为字母和下划线
标识符不能为c语言的保留字(关键字)
如:auto extern sizeof float static case for struct char goto switch continue in typedef const if union default long unsigned do register void double return else short while enum signed
算术运算符 + - * / %
关系运算符 == = = !=
逻辑运算符 ! ||
位运算符 ~ | ^
赋值运算符 = 及其扩展赋值运算符
条件运算符 ? :
逗号运算符 ,
指针运算符 *
求字节数运算符 sizeof
强制类型转换运算符 (类型)
分量运算符 . -
下标运算符 [ ]
其他 如函数调用运算符()
运算符的优先级
由高到低:单目运算符,算数运算符,关系运算符,赋值运算符
说明:单目运算符:自增运算符,自减运算符,类型装换运算符。结合方向:自右至左
如:++--I 先—i.。
算术运算 结合方向自左至右
2.3基本运算和表达式
关系表达式和逻辑表达式
(ab)(xy) (a==b)||(x==y) !=a||(ab)
Ab.a为0.不执行b
A||b a为1.不执行b
在 c 中逻辑运算结果:1代表“真”,0代表“假”;
判断一个表达式是否真:0代表“假”,非0代表“真”
条件表达式 逗号表达式
如:k=5,k++
逗号值为5;k为6.
表达式1?表达式2 :表达式3
K=56 ? 1 : 0
2.4、混合运算的数据类型转换
2/3+0.5 双精度浮点型
第三章、顺序结构程序设计
3.1、c语句的分类
简单语句
表达式语句 表达式+分号
空语句 只有分号的语句
复合语句 用花括号将若干语句括起来
流程控制语句
选择语句 if ,switch
循环语句 while, do while , for
转移语句 break ,continue ,return goto
3.2、格式输入函数scanf
一般形式:scanf(“格式控制字符串“,地址列表);
使用scanf函数时,需要注意:
格式字符的个数必须与输入项的个数相同,数据类型必须一一对应,非格式字符串(说明性的)要原封不动的输入。
输入实行数据时,可以不带小数点,即按整型数据输入
数值型数据与字符或字符串混合输入时,需要注意输入方式。
3.3、格式输出函数printf
Printf(“格式控制字符串“,输出列表);
指定输出格式,由格式字符串和非格式字符串两种组成,非格式字符串照原样输出。
%[标志][输出最小宽度][.精度][长度]类型
标志:- 左对齐;+ 右对齐;
%f, %d, %c, %s
3.4、其他输入输出函数
Putchar getchar puts gets
第四章、选择结构程序设计
If选择结构
单分支
If(表达式)
语句
双分支
If(表达式)
语句1
Else
语句2
多分支
If (表达式1)
语句1
Else if(表达式2)
语句2
。。。
Else if(表达式m)
语句m
Else
语句n
Switch(表达式)
{
Case 常量表达式1:语句1;break;
Case 常量表达式2:语句2;break;
。。。
Case 常量表达式m:语句m;break;
Default:语句n;break;
}
注意break的使用
第五章、循环结构程序设计
循环三要素
初始条件 ;终止条件 ;在初始条件和终止条件间反复做某件事情(循环体)
While(表达式)
语句
Do
语句
While(表达式);
For(循环体变量赋初值;循环条件;循环变量增量)
( for( ) ; // ; 进行时间延迟。在信息交换等时用。如for(i=0,i100) ; 互相通讯的时间延迟。 Delay )
Break语句 :不能用于循环语句和switch语句之外的任何其他语句;跳出循环。
Continue语句 :跳过循环体中剩余的语句而强行执行下一次循环;跳出本次循环。
第六章、函数与编译预处理
6.1、函数的定义和调用
类型标识符 函数名 (形式参数列表)
{ 声明部分
语句
}
例:
Int max (int x,int y)
{int z;brZ=xy?x:y;brReturn(z);}
6.2、局部变量和全局变量
注意函数中静态变量的定义和使用
6.3、变量的存储类型
局部变量的存储类型
自动变量(auto) 动态存储
局部静态变量(static) 静态存储
寄存器变量(register) 静态存储
全局变量的存储类型
自动变量(auto) 动态存储
外部变量 (extern) 静态存储
全局静态变量(static )静态存储
Extern 外部引用
Static 不能用extern 引用。
第七章、数组
7.1、一维数组的定义和使用
特别需要注意循环体的初值,终止条件
例:
Main()
{
Int I,a[10];
For(i=0;i=9;i++)
A=I;
For(i=9;i=0;i--)
Printf(“%d”,a);
}
注意下标问题
7.2、二维数组的定义和使用
二维数组的初始化
例如:
Int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
Int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Int a[ ][4]={{1,2,3,4},{5},{9,10,11,12}};
例如:int a[3][3]={{1},{2},{3}};
是对每一行的第一列元素赋值,未赋值的元素取0
7.3、字符数组和 字符串
字符串用字符数组来处理,结束标志符 ‘\0’
如:char c[ ]={“I am happy”};
用字符串常量使字符数组初值化
Char c[ ]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0’};
第八章、指针
8.1、地址和指针的概念
Int I;
Int *i_point;
8.2、指针变量和变量的地址
操作符:*
8.3、指针和一维数组
若有定义
Int a[10];
Int *p=a;
分析下面表达式的含义:
A, a,
*(a+i), a+I,
*(p+i), p+i
A=*(a+i)=*(P+i)
a=a+i=p+i
8.4、指针与字符串
Main()
{
Char string[ ]=”I love china!”;
Printf(“%s\n”,string);
}
Main()
{ char *string=”I love china!”;
Printf(“%s\n”,string);
}
8.5、指针变量作为函数参数
形参的定义方式;实参的形式;参数的传递方式。
第九章、结构体
9.1、结构体类型和变量的定义
Struct 结构体名
{成员列表};
Struct student
{char stuNO[8];brChar name[20];brChar sex;brInt age;brFloat score;brChar addr[30];br};
Stuct student
{char stuNO[8];brChar name[20];brChar sex;brInt age;brFloat score;brChar addr[30];br};
Struct student stu1, stu2;
9.2、结构体变量的引用
一般形式为:
结构体变量名.成员名
9.3、结构体数组
结构体数组 结构体数组元素.成员名
指向结构体的指针变量
(*p).成员名
p-成员名
其他
Strcpy(字符数组1,字符串2)
Strcat(字符数组1,字符数组2)
Strcmp(字符串1,字符串2)
Strlen(字符数组)
strlen是求字符串长度的函数。
函数原型:unsigned int strlen(char *s)。
参数:s是char类型的指针,指向要求长度的字符串。
返回值:返回字符串的长度,返回类型是无符号整型。
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含“\0”)。
扩展资料:
通过对C语言进行研究分析,总结出其主要特点如下:
1、简洁的语言
C语言包含的各种控制语句仅有9种,关键字也只有32 个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。
实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。
2、具有结构化的控制语句
C语言是一种结构化的语言,提供的控制语句具有结构化特征,如for语句、if、else语句和switch语句等,可以用于实现函数的逻辑控制,方便面向过程的程序设计。
参考资料:百度百科—strlen
参考资料:百度百科—C语言
getchar(字符输入函数),它的作用只是从终端输入一个字符,没有参数,函数的值就是从输入设备中得到的字符;puhchar()同理,也只能向终端输出一个字符;
如:
#include
stdio.h
main()
{
char
c;
c=getchar();
putchar(c);}
运行结果:
a
回车
a
scanf()和prinf()是格式输入/输出函数,其参数是可变的,可以连续输入,连续输出;这两个函数在C语言中用的很多,就不多说了
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流