目前,我正在嘗試這樣做,它沒有列印出任何東西(但沒有編譯問題):
我正在嘗試這樣做,它沒有列印出任何東西。
#include <stdio.h>/span>
#include <string.h>
#include <stdlib.h>
void parseGprmc(char* gprmc) {
printf("test"/span>)。
char* ptr;
ptr = strtok(gprmc, ", ")。
while(ptr != NULL) {
printf("%s
", ptr)。)
ptr = strtok(gprmc, ",")。
}
}
int main() {
char* gprmc = "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,,E*62"/span>;
printf("%s"/span>, gprmc)。
parseGprmc(gprmc)。
printf("%s", gprmc) 。
return 1。
}
我做錯了什么?
事實上,parseGprmc將列印出:
$GPRMC
081836
A
3751.65
S
14507.36
E
000.0
360.0
E*62
考慮到空值也是有效的,但我認為strtok不會這樣做。
uj5u.com熱心網友回復:
你的代碼中存在兩個嚴重的問題。首先(正如評論中指出的),strtok函式修改了作為其第一個引數的字串 - 但你已經將gprmc宣告為一個指向constant(不可變)字串字面的指標。要解決這個問題,請將宣告改為一個char陣列,該陣列用字面的copy初始化:
char gprmc[] = "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,,E*62" /span>;
其次,只有用于決議給定字串的strtok的第一次呼叫應該將該字串作為其第一個引數;隨后的呼叫(關于相同的字串)應該使用NULL第一個引數(見這個 cppreference,特別是以If str is not a null pointer, ...開頭的部分。
這里是你的parseGprmc函式的一個 "固定 "版本:
void parseGprmc(char* gprmc)
{
printf("test"/span>)。
char* ptr;
ptr = strtok(gprmc, ","); //第一次呼叫,使用字串地址。
while (ptr != NULL) {
printf("%s
", ptr)。)
ptr = strtok(NULL, ","); //后續呼叫,使用NULL。
}
}
注意,使用strtok函式不可能直接提取空(null)標記,因為函式會搜索不包含在delim中的第一個字符(引自同一cppreference頁面)。要做到這一點,你必須添加一些 "技巧",將每個標記的回傳地址與前一個標記的結束地址進行比較,并計算在 "間隙 "中有多少個分隔符字符。下面是對你的函式的一個可能的修改,以做到這一點:
void parseGprmc(char* gprmc)
{
printf("test"/span>)。
char* ptr;
char* lastend。
ptrdiff_t nBlanks;
ptr = strtok(gprmc, ","); //第一次呼叫,使用字串地址。
while (ptr != NULL) {
lastend = ptr strlen(ptr); //token中最后一個字符的地址。
printf("%s
", ptr)。)
ptr = strtok(NULL, ","); //后續呼叫,使用NULL。
nBlanks = ptr ? ptr - lastend : -1; //發現定界符的數量。
while (--nBlanks >= 1) { //每一個間隙都有一個空標記 > 1。
printf("< null token>
")。)
}
}
uj5u.com熱心網友回復:
關于strtok的一個評論是,你必須在第二次和下一次呼叫中使用NULL。這是因為在第一次呼叫后,gprmc的內容被修改了,并且有一個代替第一的位置。
ptr = strtok(gprmc, ","); //for first call before the loop
ptr = strtok(NULL, ",");//for the call following in the loop。
uj5u.com熱心網友回復:
作業?在回圈里面你不傳給strtok一個指標,你傳給NULL。參見該函式的幫助。 但也許你想要的是用strchr代替,并將','改為''
' ?
uj5u.com熱心網友回復:
strcspn可以用來決議一個字面字串。
指定器%s精確欄位%.*s用于只列印字串中的span字符。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void parseGprmc(char* gprmc) {
int span = 0;
printf("test
")。)
while( *gprmc) {
span = strcspn ( gprmc, ",") 。
if ( span) {
printf("%.*s
", span, gprmc)。)
}
else {
printf("blank field
")。)
}
gprmc = span 1;
}
}
int main() {
char* gprmc = "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,,E*62"/span>;
printf("%s
", gprmc)。)
parseGprmc(gprmc)。
printf("%s
", gprmc)。)
return 1。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314871.html
標籤:
