首页 > 其他分享 >C语言以空格分割字符串

C语言以空格分割字符串

时间:2024-03-12 22:01:00浏览次数:23  
标签:char sscanf strtok printf C语言 空格 分隔符 字符串

方法一、 使用<string.h>的strtok()

函数原型: char *strtok(char *str1, const char *str2);

头文件:#include <string.h>

功能: 用指定的分隔符分解字符串

参数:  

  • char *str1  为要分解的字符串
  • const char *str2  为分隔符字符串

返回值:  返回下一个分割后的(位于最开始的)字符串指针,如果已无从分隔,则返回NULL

程序例: 将字符串数组input通过分隔符" "(空格)分隔开,并将结果输出。

#include <stdio.h>
#include <string.h>

int main(void){   
    char input[50] = "I like www.dotcpp.com very much";
    char *p = strtok(input, " ");
    
    if(p){
        printf("%s\n", p);
    }
    while(p=strtok(NULL, " ")){//使用第一个参数为NULL来提取子串
        printf("%s\n", p);
    }
    return 0;
}

运行结果:

I
like
www.dotcpp.com
very
much

注意:

1、函数的作用是分解字符串,所谓分解,即没有生成新串,只是在s所指向的内容首次出现分界符的位置,将分界符修改成了'/0’,故第一次用strtok()返回第一个子串

2、第一次提取子串完毕之后,继续对源字符串s进行提取,应在其后(第二次,第三次。。。第n次)的调用中将strtok的第一个参数赋为空值NULL(表示函数继续从上一次调用隐式保存的位置,继续分解字符串)

这里可以称这个隐式保存的位置为返回值(注意,它不是下面所说的this指针)

对于前一次次调用来说,第一次调用结束前用一个this指针指向了分界符的下一位。

3、当this指针 隐式保存的位置 指向“\0” 时,即没有被分割的子串了,此时则返回NULL

4、可以把delim理解为分隔符的集合,delim中的字符均可以作为分隔符。

5、strtok在调用的时候,如果起始位置即为分隔符,则忽略了起始位置开始的分隔符

6、该函数会改变str1的值,所以str1必须是字符串数组,不能是字符串指针!!!!

                        

方法二、 使用<stdio.h>的sscanf()

【原型】int sscanf (char *str, char * format [, argument, ...]);

【参数】

  • 参数str为要读取数据的字符串;
  • format为用户指定的格式;(可以指定为正则表达式,也可以是普通的%d, %c等等)
  • argument为变量,用来保存读取到的数据。

【返回值】成功则返回参数数目,失败则返回-1,错误原因存于errno 中。

sscanf()会将参数str 的字符串根据参数format(格式化字符串)来转换并格式化数据(格式化字符串请参考scanf()), 转换后的结果存于对应的变量中。

sscanf()与scanf()类似,都是用于输入的,只是scanf()以键盘(stdin)为输入源,sscanf()以固定字符串为输入源。

【实例】从指定的字符串中读取整数和小写字母

#include <stdio.h>

int main()
{
    char str[] = "123568qwerSDDAE";
    
    
    //===================== 模式匹配 ==========================  
    int num;
    char lowercase[10];
    sscanf(str,"%d%[a-z]", &num, lowercase);
    printf("The number is: %d\n", num);
    printf("The lowercase is: %s\n", lowercase);
  
    //===================== 分割字符串(模式匹配的特例) ==========================  
    int a, b, c;
    sscanf("2006:03:18", "%d:%d:%d", &a, &b, &c);
    printf("a: %d, b: %d, c: %d\n", a, b, c);
    char time1[20];
    char time2[20];
    sscanf("2006:03:18 - 2006:04:18", "%s - %s", time1, time2);
    printf("time1: %s, time2: %s\n", time1, time2);
    return 0;
}

运行结果:

可以看到format参数有些类似正则表达式(当然没有正则表达式强大,复杂字符串建议使用正则表达式处理),支持集合操作,例如:

  • %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
  • %[aB'] 匹配a、B、'中一员,贪婪性
  • %[^a] 匹配非a的任意字符,贪婪性

另外,format不仅可以用空格界定字符串,还可以用其他字符界定,可以实现简单的字符串分割(更加灵活的字符串分割请使用strtok() 函数),例如在Web服务器解析HTTP请求时,可以写如下代码。

char *input;

char type[16] = {0};//HTTP请求类型,一般为GET或者POST
char path[128] = {0};//请求的文件名
char protocol[16] = {0};//HTTP协议版本号,常用为HTTP/1.1

sscanf(input, "%[^ ] %[^ ] %[^ ]", type, path, protocol);

 

 

 

1. strtok()原文链接:https://blog.csdn.net/weixin_34324082/article/details/113561523

2. sscanf()原文链接:https://blog.csdn.net/weixin_39756895/article/details/113028865

标签:char,sscanf,strtok,printf,C语言,空格,分隔符,字符串
From: https://www.cnblogs.com/FBsharl/p/18069380

相关文章

  • C语言数据结构实现酒店管理
    #include<stdio.h>#include<windows.h>#include<stdlib.h> #include<string.h>//用于用户验证 #defineMAX100//最大房间容量 #defineStytm20#definemAX1024//文件读取字符长 intfileHang(FILE*fp);intlength=0;//房间顺序 typedefintDataType;typ......
  • 实验1 C语言输入输出和简单程序编写
    1#include<stdio.h>usingnamespacestd;intmain(){ printf("O\n"); printf("<H>\n"); printf("II\n"); return0;}2#include<stdio.h>usingnamespacestd;intmain(){floata,b,c; scanf......
  • 【Azure Power BI】Power BI获取SharePoint List列表后,如何展开List/Table中的字段,以
    问题描述PowerBI获取SharePointList列表作为数据源。但是在数据源中,有Table属性值,有List属性值。如果直接展开,则会形成“笛卡尔”集的效果,变成N多行数据。效果图如下:但是,我们最终所需要的效果是:保留整体表格的行数不变,把Table中所需要的字段,List中的值使用“逗号”分隔,展示......
  • 438. 找到字符串中所有字母异位词c
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intchange(charc){returnc-'a';}booljudge(char*s,inthead,inttail,intn,int*tempp,int*temps){if(tail>=n)returnfalse;for(inti=head;i&......
  • C++ 字符串和字符操作
    1.头文件#inlcude<string>2.std::string&char*区别char*是一个指针string是一个类,内部封装了char,是一个char管理容器3.std::string&C-style字符串区别std::string是C++标准库中的字符串类,提供了许多字符串操作的方法和功能,包括长度计算、拼接、查找、替换等......
  • c语言不可不说的一件事——进制之间的转化
    进制之间的转换二进制转换二进制转换为十进制10111010.101转换方法:个位数是乘以2的0次方从小数点开始分割,(小数点前从右往左,小数点后从左往右)乘以2的对应次方(从0开始取),最后相加二进制转换为八进制转换方法:取三合一凑不够三位数就补0与八进制转换表一一对应从小数点......
  • 给定字符串,输出符合要求的子串
    给定字符串,输出出现次数>3的字符串。实例:输入:"kouredgameredokwhogameredkaraokeyukarikouredrednanikoucankoukouongakugamegame"输出:redgamekou代码:importoperatorinput_str="kouredgameredokwhogameredkaraokeyukarikouredredn......
  • c语言注释
    注释a.由于变量可能到处被定义和引用,当它被引用的次数很多时,就很难找到这个变量的含义。可以变量值前面需要加上@,这样搜索变量的含义很快。b.注释是不参与编译的c.文件开头注释可以清楚表明文件作用,功能范例一/*======================================================......
  • Python 列表中任意字符串是否存在的判断
    `importsysjudge_string=[]target_string=sys.argvjudge_string=['-?','/?','--?','-help','--help','help']target_string=sys.argvjudge_result=any(wordifwordintarget_stringelseFals......
  • “c语言+结构体+链表”实现名片系统
    //名片系统//第一步:创建名片姓名:年龄:(23)手机号:(默认为171****3422)地址:河南洛阳// 公司:tzh职务:学员//输出名片信息////第二步:删除已存在的名片////第三步:修改信息#可指定修改内容////第四步:查询信息#可查询相关姓名对应的信......