Linux数据转换
在实际编写程序的过程中,为了加强程序的稳健性,针对一串数据,我们常常需要进行预先的处理,然后才会真正的进行数据处理。比如我们首先要判断数据是否是数字、是否是字母、是否是ASCII码、是否是空格等等。下面就介绍一下这些函数,及其用法。附录中有C语言函数速查手册,便于阅读者使用。
一、字符数据识别
1.1 字母数字判断
【函数原型】:
#include <ctype.h>
int isalnum(int c);
【函数说明】:
判断字符c是否为字母或数字。当c为数字09或字母az及A~Z时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isalnum(c)?"yes":"no");
c='7';
printf("%c:%s\n",c,isalnum(c)?"yes":"no");
c='@';
printf("%c:%s\n",c,isalnum(c)?"yes":"no");
getchar();
return 0;
}
1.2 英文字母判断
【函数原型】:
#include <ctype.h>
int isalpha(int c);
【函数说明】:
判断字符c是否为英文字母。当c为英文字母az或AZ时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <stdio.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
printf("Press a key");
for(;;)
{
c=getchar();
clrscr();
printf("%c: %s letter",c,isalpha(c)?"is":"not");
}
return 0; // just to avoid warnings by compiler
}
1.3 小写字母判断
【函数原型】:
#include <ctype.h>
int islower(int c);
【函数说明】:
判断字符c是否为小写英文字母。当c为小写英文字母a~z时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,islower(c)?"yes":"no");
c='A';
printf("%c:%s\n",c,islower(c)?"yes":"no");
c='7';
printf("%c:%s\n",c,islower(c)?"yes":"no");
getchar();
return 0;
}
1.4 大写字母判断
【函数原型】:
#include <ctype.h>
int isupper(int c);
【函数说明】:
判断字符c是否为大写英文字母。当c为大写英文字母A~Z时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isupper(c)?"yes":"no");
c='A';
printf("%c:%s\n",c,isupper(c)?"yes":"no");
c='7';
printf("%c:%s\n",c,isupper(c)?"yes":"no");
getchar();
return 0;
}
1.5 阿拉伯数字判断
【函数原型】:
#include <ctype.h>
int isdigit(int c);
【函数说明】:
判断字符c是否为数字。当c为数字0~9时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isdigit(c)?"yes":"no");
c='9';
printf("%c:%s\n",c,isdigit(c)?"yes":"no");
c='*';
printf("%c:%s\n",c,isdigit(c)?"yes":"no");
getchar();
return 0;
}
1.6 十六进制判断
【函数原型】:
#include <ctype.h>
int isxdigit(int c);
【函数说明】:
判断字符c是否为十六进制数字。当c为数字09或为af(或A~F)之间的十六进制数字时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isxdigit(c)?"yes":"no");
c='9';
printf("%c:%s\n",c,isxdigit(c)?"yes":"no");
c='*';
printf("%c:%s\n",c,isxdigit(c)?"yes":"no");
getchar();
return 0;
}
1.7 ASCII判断
【函数原型】:
#include <ctype.h>
int isascii(int c);
【函数说明】:
判断字符c是否为ASCII码。当c为ASCII码时,返回非零值,否则返回零。ASCII码指0x00~0x7F之间的字符。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
char s[]="文曲星-BJGGV";
int i=12; // length of string s
clrscr(); // clear screen
textmode(0xE0); // make sure LCD mode is 3 big line
printf("%s\n",s);
for(i=0;i<12;i++)
{
if(isascii(s[i]))
putchar('^');
else
putchar('.');
}
getchar();
return 0;
}
1.8 空字符判断(TAB或空格)
【函数原型】:
#include <ctype.h>
int isblank (int c);
【函数说明】:
判断字符c是否为TAB或空格。当c为TAB或空格时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isalnum(c)?"yes":"no");
c='7';
printf("%c:%s\n",c,isalnum(c)?"yes":"no");
c='@';
printf("%c:%s\n",c,isalnum(c)?"yes":"no");
}
1.9 空白字符判断
【函数原型】:
#include <ctype.h>
int isspace(int c);
【函数说明】:
判断字符c是否为空白符。当c为空白符时,返回非零值,否则返回零。空白符指空格、水平制表符、垂直制表符、换页、换行和回车。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
char s[]="Test Line 1\tend\nTest Line 2\r";
int i;
clrscr(); // clear screen
for(i=0;i<strlen(s);i++)
{
if(isspace(s[i]))
putchar('.');
else
putchar(s[i]);
}
getchar();
return 0;
}
1.10 标点符号判断
【函数原型】:
#include <ctype.h>
int ispunct(int c);
【函数说明】:
判断字符c是否为标点符号。当c为标点符号时,返回非零值,否则返回零。标点符号指那些既不是字母数字,也不是空格的可打印字符。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
#include <string.h>
int main(void)
{
char s[]="Hello, Rain!";
int i;
clrscr(); // clear screen
printf("%s\n",s);
for(i=0;i<strlen(s);i++)
{
if(ispunct(s[i]))
printf("^");
else
printf(".");
}
getchar();
return 0;
}
1.11 可打印字符判断(除空格)
【函数原型】:
#include <ctype.h>
int isgraph(int c);
【函数说明】:
判断字符c是否为除空格外的可打印字符。当c为可打印字符(0x21~0x7E)时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isgraph(c)?"yes":"no");
c=' '; // 0x20
printf("%c:%s\n",c,isgraph(c)?"yes":"no");
c=0x7f;
printf("%c:%s\n",c,isgraph(c)?"yes":"no");
getchar();
return 0;
}
1.12 可打印字符判断(含空格)
【函数原型】:
#include <ctype.h>
int isprint(int c);
【函数说明】:
判断字符c是否为可打印字符(含空格)。当c为可打印字符(0x20~0x7E)时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%c:%s\n",c,isprint(c)?"yes":"no");
c=' ';
printf("%c:%s\n",c,isprint(c)?"yes":"no");
c=0x7f;
printf("%c:%s\n",c,isprint(c)?"yes":"no");
getchar();
return 0;
}
1.13 控制字符判断
【函数原型】:
#include <ctype.h>
int iscntrl(int c);
【函数说明】:
该函数判断字符c是否为控制字符。当c在0x00~0x1F之间或者等于0x7F(DEL)时,返回非零值,否则返回零。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
int c;
clrscr(); // clear screen
c='a';
printf("%x:%s\n",c,iscntrl(c)?"yes":"no");
c=0x0d;
printf("%x:%s\n",c,iscntrl(c)?"yes":"no");
c=0x7f;
printf("%x:%s\n",c,iscntrl(c)?"yes":"no");
getchar();
return 0;
}
二、字符数据转换
2.1 字符转换为ASCII码
【函数原型】:
#include <ctype.h>
int toascii(int c);
【函数说明】:
该函数将字符c转换为ASCII码。该函数将字符c的高位清零,仅保留低七位,返回转换后的数值。
【使用实例】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
char s[]="文曲星-BJGGV";
int i=12; // length of string s
clrscr(); // clear screen
textmode(0xE0); // make sure LCD mode is 3 big line
printf("%s\n",s);
for(i=0;i<12;i++)
putchar(toascii(s[i]));
getchar();
return 0;
}
2.2 大小写之间转换
【函数原型】:
#include <ctype.h>
int toupper(int c);
int tolower(int c);
【函数说明】:
- toupper()函数将字符c转换为大写英文字母。如果c为小写英文字母,则返回对应的大写字母;否则返回c原来的值;
- tolower()函数将字符c转换为小写英文字母。如果c为大写英文字母,则返回对应的小写字母;否则返回c原来的值。
【使用实例1】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
char *s="Hello, World!";
int i;
clrscr(); // clear screen
printf("%s\n",s);
for(i=0;i<strlen(s);i++)
{
putchar(toupper(s[i]));
}
getchar();
return 0;
}
【使用实例2】:
#include <ctype.h>
#include <syslib.h>
int main(void)
{
char *s="Hello, World!";
int i;
clrscr(); // clear screen
printf("%s\n",s);
for(i=0;i<strlen(s);i++)
{
putchar(tolower(s[i]));
}
getchar();
return 0;
}
2.3 整数与字符串间转换
【函数原型】:
#include <stdlib.h>
char *itoa(int i);
int atoi(const char *nptr);
【函数说明】:
- itoa()函数把整数i转换成字符串,并返回指向转换后的字符串的指针;
- atoi()函数把整数字符串nptr转换成整形数据并返回;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束符(‘\0’)时结束转换,并将结果返回;atoi()相当于函数strtol(nptr, (char **)NULL, 10);只是atoi()不检测错误。
【使用实例1】:
#include <syslib.h>
#include <stdlib.h>
int main(void)
{
int i=7412;
clrscr(); // clear screen
textmode(0x00);
printf("%d",i);
printf("%s",itoa(i));
getchar();
return 0;
}
【使用实例2】:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}
2.4 长整型与字符串间转换
【函数原型】:
#include <stdlib.h>
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
【函数说明】:
- atoll()函数把长整数字符串nptr转换成长整形数据并返回;
- atoll()函数把长整型数据字符串转换为long long类型数据并返回;
- atoq()函数与atoll()函数相同,把一个长整型数据字符串转换为long long类型数据并返回;atoq()是atoll()的过时名;
- strtol()函数将参数nptr字符串根据参数base来转换成长整型数;参数base代表采用的进制方式,范围从2至36,或者0;当base值为0时则采用十进制做转换,但遇到如‘0x’前置字符则使用十六进制做转换;一开始strtol()函数会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或者正负符号才开始做转换,再遇到非数字或字符串结束符(‘\0’)结束转换,并将结果返回;若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;strtol()返回转换后的长整型数据,否则返回ERANGE并将错误代码存入errno中(ERANGE表示指定的转换字符串超出合法范围)。
【使用实例1】:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}
【使用实例2】:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char *argv[])
{
int base;
char *endptr, *str;
long val;
if (argc < 2) {
fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
exit(EXIT_FAILURE);
}
str = argv[1];
base = (argc > 2) ? atoi(argv[2]) : 10;
errno = 0; /* To distinguish success/failure after call */
val = strtol(str, &endptr, base);
/* Check for various possible errors */
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
|| (errno != 0 && val == 0)) {
perror("strtol");
exit(EXIT_FAILURE);
}
if (endptr == str) {
fprintf(stderr, "No digits were found\n");
exit(EXIT_FAILURE);
}
/* If we got here, strtol() successfully parsed a number */
printf("strtol() returned %ld\n", val);
if (*endptr != ’\0’) /* Not necessarily an error... */
printf("Further characters after number: %s\n", endptr);
exit(EXIT_SUCCESS);
}
2.5 无符号长整型与字符串间转换
【函数原型】:
#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);
【函数说明】:
- strtoul()函数将参数nptr字符串根据参数base来转换成无符号长整型数;参数base代表采用的进制方式,范围从2至36,或者0;当base值为0时则采用十进制做转换,但遇到如‘0x’前置字符则使用十六进制做转换;一开始strtoul()函数会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字才开始做转换,再遇到非数字或字符串结束符(‘\0’)结束转换,并将结果返回;若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;
- strtoull()函数与strtoul()函数类似,只是将字符串转换为unsigned long long类型的数据。
2.6 浮点型数据与字符串间转换
【函数原型】:
#include <stdlib.h>
double atof(const char *nptr);
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
char *gcvt(double number, size_t ndigit, char *buf);
char *ecvt(double number, int ndigits, int *decpt, int *sign);
char *fcvt(double number, int ndigits, int *decpt, int *sign);
【函数说明】:
- atof()函数将一个浮点数字符串转化为一个浮点型数据并返回。其运行结果相当于:strtod()函数,但atof()并不对检测错误类型;
- strtod()函数将一个浮点数字符串转化为一个double型数据并返回;strtod()会扫描nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束符(‘\0’)才结束转换,并将结果返回;若endptr不为NULL,则会将遇到不合格条件而终止的nptr中的字符串指针由endptr传回;参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2;
- strtof()函数将一个单精度浮点数字符串转化为一个单精度浮点型数据并返回;
- strtold()函数将一个长双精度型字符串转化为一个长双精度浮点型数据并返回;
- gcvt()函数将浮点数number转换为长度为ndigit的字符串,使用FORTRANF或printfE格式;number是待转换的值;ndigit是转换后有效数字的个数;buf指向转换后字符串存放的位置;
- ecvt()和fcvt()函数将浮点数值转换为字符串,低位数字四舍五入,数字舍入到指定位;number是待转换的值;ndigit是转换后有效数字的个数;decpt指小数点的位置;sign是数值符号;函数返回转换后的字符串指针。
【使用实例1】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float f;
char *str = "12345.67";
f = atof(str);
printf("string = %s float = %f\n", str, f);
return 0;
}
【使用实例2】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char input[80], *endptr;
double value;
printf("Enter a floating point number:");
gets(input);
value = strtod(input, &endptr);
printf("The string is %s the number is %lf\n", input, value);
return 0;
}
【使用实例3】:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[25];
double num;
int sig=5;
num=9.876;
gcvt(num,sig,str);
printf( "string=%s ",str);
num=-123.4567;
gcvt(num,sig,str);
printf( "string=%s ",str);
num=0.678e5;
gcvt(num,sig,str);
printf( "string=%s ",str);
return(0);
}
【使用实例4】:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
char *string;
double value;
int dec,sign;
int ndig=10;
clrscr();
value=9.876;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
value=-123.45;
ndig= 15;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
value=0.6789e5;
ndig=5;
string=ecvt(value,ndig,&dec,&sign);
printf( "string=%s dec=%d sign=%d ",string,dec,sign);
return 0;
}