strtok 源码(c语言有人会吗)

本文目录
- c语言有人会吗
- c语言截断字符串
- C语言 字符串处理函数strtok第二次及以后的调用中第一个参数要用NULL的原因是什么 能不能解释下原理
- 漂亮打印问题,求C++源代码
- 请问 strtok() 函数 和 strrev() 函数的 重写!!!! 就是 自己 重新写的 源代码!!!
c语言有人会吗
使用fgets依次读入每行内容,注意行尾的换行符’\n’也会读入
先判断读入的内容是否为"stop\n",是的话即跳出循环,停止输入
对于读入的该行字符串,使用while函数依次遍历每个字符
以空格作为单词的间隔统计每个单词的长度,保存其中最长的单词及对应的起始下标
最后输出每行单词的长度之和、每行最长单词即可
C代码如下:
运行结果如下:
输出符合样例,望采纳~
附源码:
#include 《stdio.h》
#include 《string.h》
#define N 105
int main() {
char s;
int i, j, cnts, start, maxlen, len;
while (1) {
memset(s, 0, N); // 初始化字符数组
fgets(s, N, stdin);
if (strcmp(s, "stop\n") == 0)
break; // 输入stop停止,注意fgets会读入’\n’
i = 0; cnts = 0; start = 0; maxlen = 0;
while (s != ’\n’) {
len = 0; // 统计每个单词的长度
while (s != ’ ’) {
len++;
i++;
}
cnts += len;
if (len 》 maxlen) {
maxlen = len; // 保存最长单词的长度
start = i - len; // i-1-start+1=len,保存最长单词的起始下标
}
if (s == ’\n’)
break; // 到达行尾
while (s == ’ ’) // 跳过单词间的空格
i++;
}
printf("%d ", cnts);
for (j = start; j 《 start + maxlen; j++) // 输出最长单词
printf("%c", s);
printf("\n");
}
return 0;
}
c语言截断字符串
//写法很多,我提供一份源码,仅供参考。
#include 《stdio.h》
#include 《string.h》
//字符串分割函数
int GetToken(char *pszSrc, char *pszSplit, char *pszDest)
{
int iPos;
char *pPtr = NULL;
pPtr = strstr(pszSrc, pszSplit);
if( pPtr )
{
iPos = strlen(pszSrc) - strlen(pPtr);
strncpy(pszDest, pszSrc, iPos);
strcpy(pszSrc, pPtr + strlen(pszSplit));
pszDest = ’\0’;
}
else
{
iPos = strlen(pszSrc);
strncpy(pszDest, pszSrc, iPos);
pszDest = ’\0’;
pszSrc = ’\0’;
return 0;
}
return 1;
}
int main()
{
char szData = "1234:01201407291000000001:abcdefgskskjdfskdjskfjsfsdjf";
char szFiled1;
char szFiled2;
char szFiled3;
GetToken(szData, ":", szFiled1);
GetToken(szData, ":", szFiled2);
GetToken(szData, ":", szFiled3);
printf("Filed1=%s\nFiled2=%s\nFiled3=%s\n", szFiled1, szFiled2, szFiled3);
return 0;
}
希望能够帮助到你,你的好评是我前进的动力。
C语言 字符串处理函数strtok第二次及以后的调用中第一个参数要用NULL的原因是什么 能不能解释下原理
编程中的NULL
一.NULL字符
在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
二.NULL指针
在C语言的头文件stddef.h中,NULL的定义如下: #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif #interface NULL 0 可见,NULL指针是一个无类型指针,并且值为0。一个指针,拥有2个属性--地址值和指针类型。两者的作用是:1,地址值标识变量的首地址(32位系统下指针的地址值占4字节);2,指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的;等等)。 NULL的出现是一种约定俗成,事实上它不是C语言中的关键字;把一个指针赋值为NULL,通常的说法是“将指针悬空”。这样,指针就无法再进行任何数据访问了。编程工作中有一类比较容易犯的错误--指针地址未进行正确的更新赋值就加以使用,这往往会造成很严重的后果(对内存区进行错误的涂抹)。所以一个良好的习惯是,当一个指针的工作稍事休息,先把它赋值为NULL,待到再度使用时,重新对其赋值以及进行指针类型转化。 前面说到“NULL指针无法再进行任何数据访问”,其实是视编译器功能而定的。0位置指向的是程序起始,对于不同的编译器,NULL指针的操作结果是不同的:有些是不准读写,有些是只读,甚至读写都允许。编译器是人定的。引用网友win_hate在话题“关于NULL的不严谨”中的话来说:“如果说有谁不严谨了,那必定是读取0位置的程序员,而不是C。C的设计哲学之一是:‘程序员知道自己在干什么--没有安全带’”。
三.数据库中的NULL
Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在.
四.NULL与0的疑惑
NULL与0有着扯不断理还乱的关系,其实不那么高深。0本身有着一些原生的特性诸如:起始,没有,正负的分界线,0/1中的0还可以表示否定。NULL正需要这些特性中的一部分。 我们只需要清楚NULL的本质,并在合理的地方才加以利用而非滥用。譬如我想做一个比较某个整数i是否为0,难道写成i==NULL会比i==0更酷一点吗?
五.matlab中的函数
函数null用来求解零空间,即满足方程组A*X=0的解空间。实际上是求出解空间的一组解(基础解系)。 语法:z=null(A) %z的列向量为方程组的正交规范基,满足z‘ x z=I。 z=null(A,’r’) %z的列向量是方程A*X=0的有理基。
漂亮打印问题,求C++源代码
void
CTestDlg::OnPrint()
{
char
szprinter;
char
*szDevice,*szDriver,*szOutput;
HDC
hdcprint;
//
定义一个设备环境
句柄
//定义一个打印作业
static
DOCINFO
di={sizeof(DOCINFO),"printer",NULL};
//
得到设备字符串存入数组szprinter中
GetProfileString("windows","device",",,,",szprinter,80);
//
将设备字符串分解
if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&&
NULL!=(szOutput=strtok(NULL,",")))
//
创建一个打印机设备句柄
if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
{
if(StartDoc(hdcprint,&di)》0)
//开始执行一个打印作业
{
StartPage(hdcprint);
//打印机走纸,开始打印
SaveDC(hdcprint);
//保存打印机设备句柄
//
输出一行文字
TextOut(hdcprint,1,1,"热烈祝贺编程实例出版发行!",16);
RestoreDC(hdcprint,-1);
//恢复打印机设备句柄
EndPage(hdcprint);
//打印机停纸,停止打印
EndDoc(hdcprint);
//结束一个打印作业
MessageBox
("打印完毕!","提示",MB_ICONINFORMATION);
}
//
用
API函数
DeleteDC销毁一个打印机设备句柄
DeleteDC(hdcprint);
}
else
{
MessageBox("没有默认打印机,或者没有
安装打印机
!");
return;
}
}
如果觉得好的话不要忘了给分哦
我用C++做的哦
能实现
请问 strtok() 函数 和 strrev() 函数的 重写!!!! 就是 自己 重新写的 源代码!!!
char *strtok(char * s1,char *s2)
{
static char *cs=NULL;
char *rt=NULL;
int i,j;
if (cs==NULL) cs=s1;
for (i = 0; cs ; i++) {
for (j=0; s2; j++)
if (cs) break;
if (s2) {
rt=cs;
cs=’\0’;
cs+=i+1;
break;
}
}
return rt;
}
//-------------------------------------------------------------
char *strrev(char *a)
{
int i,j,len=0;
char t;
while (a) ;
--len ;
for (i=0,j=len-1; i《j; i++,--j) {
t=a;
a;
a=t;
}
return a;
}

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






