C语言从字符串中解析数据

前言

在C语言开发过程中,总是会遇到要解析字符串中数据的任务。这里总结了三种方法去实现从给定字符串中解析特定内容的数据。


1. 使用标准库函数如 sscanf

sscanf 函数类似于 scanf,但它从字符串中读取数据,而不是从标准输入。你可以使用它来根据指定的格式从字符串中解析出数据。

#include <stdio.h>  
  
int main() {  
    char str[] = "Name:John Age:30";  
    char name[50];  
    int age;  
  
    if (sscanf(str, "Name:%s Age:%d", name, &age) == 2) {  
        printf("Name: %s, Age: %d\n", name, age);  
    } else {  
        printf("Parsing failed\n");  
    }  
  
    return 0;  
}

2. 使用 strtok 函数

strtok 函数用于分割字符串,基于指定的分隔符集合。它非常适合于解析由固定分隔符分隔的字段。

函数原型:

char *strtok(char *str, const char *delim);

参数

  •  str:指向要被分解的字符串的指针。在第一次调用时,这个参数应该是一个指向字符串的指针。在后续的调用中,为了继续从上次的位置分解字符串,这个参数应该被设置为NULL。
  • delim:一个包含分隔符的字符串。当strtok函数在str参数指定的字符串中遇到delim字符串中的任何字符时,它会将该字符替换为字符串结束符\0,从而分割出子串。

功能:

  • strtok函数按照delim字符串中定义的字符来分解str字符串,每次调用返回一个指向当前分割出的子串的指针。如果str为NULL,则strtok函数会从上次分解停止的地方继续分解字符串。
  • 当字符串中的字符全部被分割完毕,或者str为NULL且没有更多的子串可以返回时,strtok函数会返回NULL。

注意事项:strtok函数会修改原始的字符串,因为它会用\0替换分隔符。

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char str[] = "Name:John Age:30";  
    char *token;  
    char delimiters[] = " :";  // 由空格或者冒号分割
  
    // 获取第一个字段  
    token = strtok(str, delimiters);  
    // 跳过 "Name"  
    token = strtok(NULL, delimiters);  
    printf("Name: %s\n", token);  
  
    // 获取下一个字段  
    token = strtok(NULL, delimiters);  
    // 跳过 "Age"  
    token = strtok(NULL, delimiters);  
    printf("Age: %s\n", token);  
  
    return 0;  
}

 注意:strtok 会修改原始字符串,将其中的分隔符替换为字符串结束符 \0


3. 手动遍历字符串

对于更复杂的解析需求,或者当上述方法不适用时,你可能需要手动遍历字符串,并根据特定的逻辑来解析数据

#include <stdio.h>  
#include <ctype.h> // 用于isspace()  
  
int main() {  
    char str[] = "Name:John Age:30";  
    int i = 0, inName = 0, inAge = 0;  
    char name[50] = {0}, age[10] = {0};  
  
    while (str[i] != '\0') {  
        if (isspace(str[i])) {  
            if (inName) {  
                inName = 0;  
                inAge = 0;  
            }  
        } else if (inName) {  
            name[strlen(name)] = str[i];  
        } else if (strncmp(&str[i], "Name:", 5) == 0) {  
            i += 5; // 跳过 "Name:"  
            inName = 1;  
        } else if (strncmp(&str[i], "Age:", 4) == 0) {  
            i += 4; // 跳过 "Age:"  
            inAge = 1;  
        }  
        i++;  
    }  
  
    // 可能还需要处理inAge为true时的情况,这里简化处理  
  
    printf("Name: %s\n", name);  
    // 注意:age字段可能为空,因为示例中没有正确地将其存储到age数组中  
    // 这里只是演示逻辑,实际使用时需要调整  
  
    return 0;  
}

注意:这个示例简化了处理过程,并没有完全将年龄数据存入 age 数组,只是展示了基于条件判断来解析字符串的基本思路。这里isspace函数是一个在计算机编程中广泛使用的函数,主要用于检查一个字符是否为空白字符。空白字符包括空格(' ')、水平定位字符('\t')、归位键('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值