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;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容