网易云课堂 程序设计入门–C语言 指针与字符串 学习笔记
sizeof(int); sizeif(i);
{
int a;
a =6;
printf("sizeof(int)=%ld\n",sizeif(int));
printf("sizeof(a)=%d\n",sizeof(a));
return 0;
}
--->sizeof(int)=4
sizeof(a)=4
运算符 &
scanf(“%d”,&i);里的 &
· 取得变量的地址,它的操作数必须是变量
int i;prinf("0x%x",&i);
–>Ox9ffe4c //%x 16进制
地址的大小是否与int相同,取决于编译器
· & 可以帮忙取出一个变量的地址,但是这个地址的大小,数据类型,与int是否相等取决于编译器,取决于是64还是32位架构
int i;printf("%p",&i);
要输出地址,用%p,而不是直接当成整数,地址和整数不总是相等的
{
int i=0;
printf("0x%x\n",&i);
printf("%p\n",&i);
printf("%lu\n",sizeof(int));
printf("%lu\n",sizeof(&i));
return 0;
}
--->0xbff62d6c
0xbff62d6c
4 4
8(64位) 4(32位)
{
int i =0;
int p;
printf("%p\n",&i);
printf("%p\n",&p);
return 0;
}
--->0xbff81d6c
0xbff81d68 堆栈stack自顶向下
int a[10];
printf("%p\n",&a);
printf("%p\n",a);
printf("%p\n",&a[0]);
printf("%p\n",&a[1]);
return 0;
--->0xbff8dd44
0xbff8dd44
0xbff8dd44
0xbff8dd48 -->&a==a==&a[0]
scanf
就是保存地址的变量
int i;
int* p=&i;
*表示p是一个指针,它指向一个int,把i的地址给了p int* p,q;
*可以靠近int也可以靠近P,但意思一样,说明P是一个指针,指向一个int int *p,q;
而q只是一个普通的int类型的变量 *不是加给了int,而是加给了p 指针变量 变量的值是内存的地址
· 普通变量的值是实际的值
· 指针变量的值是具有实际值的变量的地址
#include
void f (int* p);
void g (int k);
int main(void){
int i=6;
printf("&i=%p\n",&i); //看下i的地址
f(&i);
g(i);
return 0;
}
void f (int *p){ //p得到的是i的地址,使得拥有了能够访问外面的i的能力了
printf(" p=%p\n",p);
printf("*p=%d\n",*p); //*和指针变量p放在一起作为一个整体,表示一个整数
*p=26; //实际是对i做的
}
void g (int k){ //在g里面k变量得到的只是i的值,跟外面的i没有任何关系
printf(" k=%d\n",k);
}
===>&i=0xbffbcd70
p=0xbffbcd70
*p=6
k=26 //经历了f函数的调用,i的值被改了
scanf("%c",&c);-->1
scanf("%d",&i);-->49
if(49=='1'){printf("OK");} --->OK
int main (void){
char c;
char d;
c=1;
d='1';
if(c==d){
printf("相等\n");
}else{
printf("不相等\n");
}
printf("c=%d\n",c);
printf("d=%d\n",d);
return 0;
}
--->不相等
c=1
d=49
int main (void){
char c;
scanf("%c",&c);
printf("c=%d\n",c);
printf("c=%c\n",c);
return 0;
}
输入:1
输出:c=49
c=1
int main (void){
int c;
scanf("%d",&c);
printf("c=%d\n",c);
printf("c=%c\n",c);
return 0;
}
输入:1
输出:c=49
c=" "
int main (void){
int i;
int c;
scanf("%d",&i);
c=i; //整数49交给了c
printf("c=%d\n",c); //c做为整数输出是49
printf("c='%c'\n",c); //c做为字符输出是1
return 0;
}
输入:49
输出:c=49
c="1"
scanf("%d %c",&i,&c);
scanf("%d%c",&i,&c);
char c='A'; c++; printf("%c\n",c);--->B
int i='Z'-'A'; printf("%d\n",i);--->25
printf("请分别输入身高的英尺和英寸","如输入\"5 7\"表示5英尺7英寸:")
字符 | 意义 | 字符 | 意义 |
---|---|---|---|
\b | 回退一格 | \” | 双引号 |
\t | 到下一个表格位 | \’ | 单引号 |
\n | 换行 | \|反斜杠本身 | |
\r | 回车 |
word[0] | H |
---|---|
word[1] | e |
word[2] | l |
word[3] | l |
word[4] | o |
word[5] | ! |
word[0] | H |
---|---|
word[1] | e |
word[2] | l |
word[3] | l |
word[4] | o |
word[5] | ! |
word[6] | \0 |
[注]: C语言70年代更注重处理数字,80年代之后的语言才开始侧重处理信息,处理字符串
scanf ("%7s",string);
int main()
{
char word[8];
char word2[8];
scanf ("%s",word);
scanf ("%s",word2);
printf("%s##%s##\n",word,word2);
}
输入hello world!
输出hello##world!##
#include
size_t strlen(const char *s)
返回s的字符串长度(不包括结尾的0)#include
#include
int main(void)
{
char line[] ="hello";
printf("strlen=%lu\n",strlen(line));
printf("sizeof=%lu\n",sizeof(line));
return 0;
}-->strlen=5
sizeof=6
int strcmp(const char *s1,const char *s2)
//compare比较#include
#include
int main(void)
{
char s1[] ="abc";
char s2[] ="Abc";
printf("%d\n",s1==s2);//数组的比较永远是false,因为两个数组永远不会是相同的地址,用==比较是否是相同的地址
printf("%d\n",strcmp(s1,s2));
return 0;
}-->0
1
char * strcpy(char *restrict dst,const char *restrict src);
//copy复制char * strcat(char *restrict s1,const char *restrict s2)
//链接char * strncpy(char *restrict dst,const char *restrict src,size_t n);
char * strncat(char *restrict s1,const char *restrict s2,size_t n)
int strncmp(const char *s1,const char *s2,size_t n)
char *strchr(const char *s,int c);
char *strrchr(const char *s,int c);
int a[] = {5, 15, 34, 54, 14, 2, 52, 72};
int *p = &a[5];
int a[] = {0};int *p = a;
则以下哪些表达式的结果为真? char* s;scanf("%s", s);
int* p,q;
中,p和q都是指针。 'b'-'a'
题目内容:
你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it’s”算一个单词,长度为4。注意,行中可能出现连续的空格。
#include
#include
int main(){
char str[50]="\0";
scanf("%s",str);
// printf("%s ",strchr(str,'.'));
while(strchr(str,'.')==NULL){
printf("%d ",strlen(str));
scanf("%s",str);
}
printf("%d",(strlen(str)-1));
return 0;
}
题目内容:
NMEA-0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。
NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有
$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL
等。其中
$GPRMC
语句的格式如下:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
这里整条语句是一个文本行,行中以逗号“,”隔开各个字段,每个字段的大小(长度)不一,这里的示例只是一种可能,并不能认为字段的大小就如上述例句一样。
字段0:$GPRMC
,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式
字段2:状态,A=定位,V=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度N(北纬)或S(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度E(东经)或W(西经)
字段7:速度,节,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东W=西
字段16:校验值
这里,“*”
为校验和识别符,其后面的两位数为校验和,代表了“$”
和“*”
之间所有字符(不包括这两个字符)的异或值的十六进制值。上面这条例句的校验和是十六进制的50,也就是十进制的80。
提示:^运算符的作用是异或。将$
和*
之间所有的字符做^运算(第一个字符和第二个字符异或,结果再和第三个字符异或,依此类推)之后的值对65536取余后的结果,应该和*后面的两个十六进制数字的值相等,否则的话说明这条语句在传输中发生了错误。注意这个十六进制值中是会出现A-F的大写字母的。另外,如果你需要的话,可以用sscanf(s,”%d”, &i)从字符串s中得到其所表达的整数数字给i。
现在,你的程序要读入一系列GPS输出,其中包含$GPRMC
,也包含其他语句。在数据的最后,有一行单独的
END
表示数据的结束。
你的程序要从中找出$GPRMC
语句,计算校验和,找出其中校验正确,并且字段2表示已定位的语句,从中计算出时间,换算成北京时间。一次数据中会包含多条$GPRMC语句,以最后一条语句得到的北京时间作为结果输出。
你的程序一定会读到一条有效的$GPRMC
语句。
//输入一行字符,统计其中单词个数,单词之间空格隔开
#include
#include
int main(){
char c[100];
scanf("%s",c);
// printf("%d\n",strcmp(c,"END"));
while(strcmp(c,"END")!=0){
int i,n=c[1];
for(i=2;c[i]!='*';i++){
n=n^c[i];
}
n=n%65536;
// printf("%x\n",n);
// printf("第一位%c ",c[i+1]); // %d输出ASCII码
// printf("第二位%c\n",c[i+2]);
// printf("校验%x\n",(c[i+1]-48)*16+(c[i+2]-48)); //怎么样取出字符数组元素的数值
// printf("-----\n");
int yanzheng=(c[i+1]-48)*16+(c[i+2]-48);
if(n==yanzheng){
printf("%c%c:%c%c:%c%c",c[7],c[8],c[9],c[10],c[11],c[12]);
break;
}else{
scanf("%s",c);
}
}
return 0;
}
// char c[100];
// scanf("%c");
// scanf("%c",&c[0]);
// scanf("%c",&c[1]);
// int i,n=c[0];
// for(i=1;c[i]!='*';i++){
// n=n^c[i];
// scanf("%c",&c[i+1]);
// }
// n=n%65536;
// scanf("%c",&c[i]);
// scanf("%c",&c[i+1]);
// printf("%x\n",n);
//// printf("%c ",c[i]); // %d输出ASCII码
//// printf("%c\n",c[i+1]);
//// printf("%x",(c[i]-48)*16+(c[i+1]-48)); //怎么样取出字符数组元素的数值
// int yanzheng=(c[i]-48)*16+(c[i+1]-48);
// if(n==yanzheng){
// printf("%c%c:%c%c:%c%c",c[6],c[7],c[8],c[9],c[10],c[11]);
// }
/*$GPRMC,024813.640,A,315ty.4608,N,11848.3737,E,10.05,324.27,150706,,,A*51
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*51
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
END*/