记录部分rtklib源码中出现的基础函数,便于自己理解与分析。
目录
1、C库函数
1.1、strstr()
char *strstr(const char *haystack, const char *needle)在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
1.2、strchr()和strrchr()
char *strchr(const char *str, int c)在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
char *strrchr(const char *str, int c)与 strchr 函数一样,它同样表示在字符串 str 中从后往前查找字符 c,返回字符 c 第一次在字符串 str 中出现的位置,如果未找到字符 c,则返回 NULL。
1.3、strnmp()和strncmp()
int strcmp(const char *str1, const char *str2)比较str1、str2两个字符串,若str1、s2字符串相等,则返回零;若str1大于str2,则返回大于零的数;否则,则返回小于零的数。
int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节,返回值与strcmp()一样
1.4、strcpy()和strncpy()
char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest
char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充
1.5、malloc()
void* malloc(size_t size)成功时,返回指向新分配内存的指针。为避免内存泄漏,必须用 free() 或 realloc() 解分配返回的指针;失败时,返回空指针。size为要分配的字符数。
1.6、fopen()
FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。
"r" | 打开一个用于读取的文件。该文件必须存在。 |
"w" | 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 |
"a" | 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 |
"r+" | 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 |
"w+" | 创建一个用于读写的空文件。 |
"a+" | 打开一个用于读取和追加的文件。 |
1.7、fgets()
char *fgets(char *str, int n, FILE *stream) 从指定的流stream读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
1.8、fabs()
double fabs(double x) 返回 x 的绝对值。
2、RTKLIB定义函数
2.1、setstr()
函数将 src字符串中长度为n的字串,复制给dst,长度必须小于strlen(dst),但是无论n为多少,dst的内容都被覆盖
/* set string without tail space ---------------------------------------------*/
static void setstr(char *dst, const char *src, int n)
{
char *p=dst;
const char *q=src;
while (*q&&q<src+n) *p++=*q++;
*p--='\0';
while (p>=dst&&*p==' ') *p--='\0';
//子符串中空格与dst最后一格均补上'\0'
}
2.2、str2num()
s是需要复制的字符串,i是从s中第i个字符开始,一直截取n位,然后将截取的字符串转化为数值类型。
extern double str2num(const char *s, int i, int n)
{
double value;
char str[256],*p=str;
if (i<0||(int)strlen(s)<i||(int)sizeof(str)-1<n) return 0.0;
//检验i必须大于0,起始的i位置必须小于原字符串的长度,复制总数必须小于str数组的长度
for (s+=i;*s&&--n>=0;s++) *p++=*s=='d'||*s=='D'?'E':*s;
//将原字符串s全部复制到str数组中,若其中有 d/D 改成 E 进行存储
*p='\0';
return sscanf(str,"%lf",&value)==1?value:0.0;
//将str以长浮点型格式放入value,成功则返回value值,不成功返回0
}