sizeofshell
運算符 &數組
void pointerDemo(void) { int i = 0; int p; p = (int)&i; printf("0x%x\n", p); printf("%p\n", &i); printf("%lu\n", sizeof(int)); //32位系統爲4 64位系統爲4 printf("%lu\n", sizeof(&i));//32位系統爲4 64位系統爲8 }
數組與地址:安全
#include <stdio.h> int main(int argc, char *argv[]) { int a[10]; printf("%p\n", &a); printf("%p\n", a); printf("%p\n", &a[0]); printf("%p\n", &a[1]); return 0; }
運行結果:架構
000000000069FE20 000000000069FE20 000000000069FE20 000000000069FE24 -------------------------------- Process exited after 0.1564 seconds with return value 0
scanf函數
指針測試
做爲參數的指針編碼
訪問那個地址上的變量*翻譯
傳入函數的數組成了什麼?設計
int isPrime(int x, int knownPrimes[], int numberOfKonwPrimes){ //... }
數組參數
數組變量是特殊的指針
字符類型
字符的輸入輸出
#include <stdio.h> int main(int argc, char *argv[]) { char c; scanf("%c", &c); printf("c=%d\n", c); printf("c='%c'\n", c); return 0; }
輸出結果:
1 c=49 c='1' -------------------------------- Process exited after 0.9084 seconds with return value 0
字符計算
大小寫轉換
#include <stdio.h> int main(int argc, char *argv[]) { char c = 'e'; printf("a=%d\n", 'a'); printf("A=%d\n", 'A'); printf("a-A=%d\n", 'a' - 'A'); printf("A-a=%d\n", 'A' - 'a'); c = c + 'A' - 'a'; printf("c+A-a=%c\n", c); c = c + 'a' - 'A'; printf("c+A-a=%c\n", c); return 0; }
a=97 A=65 a-A=32 A-a=-32 c+A-a=E c+A-a=e -------------------------------- Process exited after 0.1735 seconds with return value 0
逃逸字符
製表位
Process exited after 0.222 seconds with return value 0
```
回車和換行
字符串變量
字符串常量(字符串字面量)
字符串
字符串輸入輸出
常見錯誤
空字符串
string.h
strlen
strcmp
strcpy
strcat
安全問題
安全版本
字符串中找字符
一、題目內容: 題目內容:
你的程序要讀入一行文本,其中以空格分隔爲若干個單詞,以‘.’結束。你要輸出這行文本中
每一個單詞的長度。這裏的單詞與語言無關,能夠包括各類符號,好比「it's」算一個單詞,長
度爲 4。注意,行中可能出現連續的空格。
輸入格式:
輸入在一行中給出一行文本,以‘.’結束,結尾的句號不能計算在最後一個單詞的長度內。
輸出格式:
在一行中輸出這行文本對應的單詞的長度,每一個長度之間以空格隔開,行末沒有最後的空格。
輸入樣例:
It's great to see you here.
輸出樣例:
4 5 2 3 3 4
題目分析:
程序實現:
#include <stdio.h> #include "inputText.h" int main(int argc, char *argv[]) { inputALineOfText(); return 0; } #ifndef inputText_h #define inputText_h #include <stdio.h> #include <string.h> void inputALineOfText(); #endif #include "inputText.h" void inputALineOfText(){ char str[500]; printf("Please input a line of text:"); gets(str); printf("Your input text's word length respectively are:\n"); int wordCount=0; for(int i=0;i<sizeof(str)/sizeof(str[0]);i++){ //printf("'%c',",str[i]); if(str[i]==' '){//單詞邊界 if(wordCount>0){ printf("%d ",wordCount); } wordCount = 0;//從新計數 } else if(str[i]=='.'){ printf("%d",wordCount); break; } else if(str[i]=='\0'){ printf("%d",wordCount); break; }else{ wordCount++; } } }
測試樣例:
Please input a line of text:It's great to see you here. Your input text's word length respectively are: 4 5 2 3 3 4 -------------------------------- Process exited after 13.37 seconds with return value 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,1
50706,,,A50
這裏整條語句是一個文本行,行中以逗號「,」隔開各個字段,每一個字段的大小(長度)不一,
這裏的示例只是一種可能,並不能認爲字段的大小就如上述例句同樣。
字段 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 語句。
輸入格式:
多條 GPS 語句,每條均以回車換行結束。最後一行是 END 三個大寫字母。
輸出格式:
6 位數時間,表達爲:
hh:mm:ss
其中,hh 是兩位數的小時,不足兩位時前面補 0;mm 是兩位數的分鐘,不足兩位時前面
補 0;ss 是兩位數的秒,不足兩位時前面補 0。
輸入樣例:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,1507
06,,,A50
END
輸出樣例:
10:48:13
題目分析:
程序實現:
#include <stdio.h> #include "GPSValidate.h" int main(int argc, char *argv[]) { validateGPS(); return 0; } #ifndef GPSValidate_h #define GPSValidate_h #include <stdio.h> #include <string.h> void validateGPS(); #endif #include "GPSValidate.h" #include <stdio.h> #include <string.h> /* 十六進制數轉換爲十進制數 */ long hexToDec(char *source); /* 返回ch字符在sign數組中的序號 */ int getIndexOfSigns(char ch); /* 十六進制數轉換爲十進制數 */ long hexToDec(char *source) { long sum = 0; long t = 1; int i, len; len = strlen(source); for(i=len-1; i>=0; i--) { sum += t * getIndexOfSigns(*(source + i)); t *= 16; } return sum; } /* 返回ch字符在sign數組中的序號 */ int getIndexOfSigns(char ch) { if(ch >= '0' && ch <= '9') { return ch - '0'; } if(ch >= 'A' && ch <='F') { return ch - 'A' + 10; } if(ch >= 'a' && ch <= 'f') { return ch - 'a' + 10; } return -1; } int calculateGPSCode(char gpsStr[],int arrCount){ if(gpsStr==NULL) return 0; int gpsCode=0; int isBeginCalc = 0; int isFirstCalc = 1; //形式參數,sizeof(gpsSrt)的長度始終爲8,和實參無關 //for(int i=0;i<sizeof(gpsStr)/sizeof(gpsStr[0]);i++){ for(int i=0;i<arrCount;i++){ if(gpsStr[i]=='$'){ //開始計算異或值 isBeginCalc=1; }else if(gpsStr[i]=='*' || gpsStr[i]=='\0'){//結束異或值計算 break; }else{ if(isBeginCalc==1){ if(isFirstCalc==1){ gpsCode = (int)gpsStr[i]; isFirstCalc=0; //printf("%c",gpsStr[i]); }else{ gpsCode = gpsCode ^ (int)gpsStr[i]; //printf("^%c",gpsStr[i]); } } } } gpsCode = gpsCode%65536; return gpsCode; } void getGPSCode(char *gpsCode ,const char* gpsStr,int arrCount){ if(gpsStr==NULL) return; int j=0; int isBeginGetCode=0; for(int i=0;i<arrCount;i++){ if(gpsStr[i] == '*'){//*日後爲校驗碼 isBeginGetCode=1; } else if(gpsStr[i] == '\0'){ gpsCode[j]='\0'; break; } else{ if(isBeginGetCode == 1){ gpsCode[j] = gpsStr[i]; j++; } } } } void getUTCTime(char *outChar,const char *gpsChar,int length){ if(gpsChar == NULL) return; int filedIndex=0; int j=0; for(int i=0;i<length;i++){ if(gpsChar[i] == ','){ filedIndex++; } else { if(filedIndex == 1) { outChar[j]=gpsChar[i]; j++; } else if(filedIndex > 1){ outChar[j] = '\0'; break; } } } } int isContainsGPSInfo(char *gpsChar,int length){ if(gpsChar == NULL) return 0; int isContain=0; int filedIndex=0; for(int i=0;i<length;i++){ if(gpsChar[i] == ','){ filedIndex++; } else { if(filedIndex == 2) { if(gpsChar[i] == 'A'){ isContain = 1; break; } } else if(filedIndex > 2){ isContain = 0; break; } } } return isContain; } void getBeiJingTime(char *outChar,char *utcTimeChar){ if(utcTimeChar == NULL) return; char utcPrefix[10]; strtok(utcTimeChar,"."); if(utcTimeChar != NULL){ int utcPrefixInt=0; sscanf(utcTimeChar,"%d",&utcPrefixInt); int beiJingTimeInt = utcPrefixInt + 80000; char tmp[10]; sprintf(tmp,"%d",beiJingTimeInt); int j=0; int colonIndexFirst = 2; int colonIndexSecond = 4; for(int i=0;i<strlen(tmp);i++,j++){ if(i==0){ if(beiJingTimeInt<100000) {//5位 outChar[j]='0'; outChar[++j]=tmp[i]; colonIndexFirst--; colonIndexSecond--; }else{ outChar[j]=tmp[i]; } } else if(i==colonIndexFirst || i==colonIndexSecond) { outChar[j]=':'; outChar[++j]=tmp[i]; } else if(i==strlen(tmp)-1) { outChar[j]=tmp[i]; outChar[++j]='\0'; } else{ outChar[j]=tmp[i]; } } } } void validateGPS(){ char str[500]; printf("Please input a GPS text:"); gets(str); while(strcmp(str,"END")!=0){ printf("%s\n",str); int length = strlen(str);//sizeof(str)/sizeof(str[0]); int gpsCode = calculateGPSCode(str,length); printf("Correct gpsCode is %d\n",gpsCode); char realGPSCode[20]; getGPSCode(realGPSCode,str,length); long realCodeLong = hexToDec(realGPSCode); printf("Real GPSCode is %d\n",realCodeLong); if(realCodeLong == (long)gpsCode){ int isContainsGPS = isContainsGPSInfo(str,length); printf("isContainGPS:%d \n",isContainsGPS); if(isContainsGPS == 1){ char utcTime[20]; getUTCTime(utcTime,str,length); char beiJingTime[10]; getBeiJingTime(beiJingTime,utcTime); printf("utcTime:%s\n",utcTime); printf("Success!\n"); printf("BeiJingTime is %s\n",beiJingTime); } }else { printf("Invalid GPS reenter:\n"); } gets(str); } }
測試樣例:
Please input a GPS text:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50 $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50 Correct gpsCode is 80 Real GPSCode is 80 isContainGPS:1 utcTime:024813 Success! BeiJingTime is 10:48:13 END -------------------------------- Process exited after 13.36 seconds with return value 0