方式1:当字符不为结束符时,从头到尾扫描,遇非空格则拷贝(可删除字符串中所有空格)
方式2:当字符不为结束符时,i从头扫描,遇空格则i++;j从尾扫描,遇空格则j--。最终确定字符串长度,一次性拷贝(只能删除非空格字符串前和后的空格,不能删除出现在字符串中间的空格)
方式1:利用递归和栈模型实现(全局变量:不用传参,多线程时可用性差;递归局部变量:传参,通用性强)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 1000
int main()
{
char a[MAXSIZE] = { '1','a','2','b' };//1数组指定长度,2用字符初始化,3会自动补'\0'以结束
char b[] = { '1','a','2','b' }; //1数组不指定长度,2用字符初始化,3不以'\0'结束
char c[] = "1233456546";//1数组不指定长度,2用字符串初始化,3自动补'\0'结束
char d[MAXSIZE] = "1233456546";//1数组指定长度,2用字符初始化,3自动补'\0'结束
//char e[2] = "fsdf"; //直接报错,长度非法
char f[2] = "fs"; //不会报错,但不自动添加'\0',因为没有空间
printf("strlen(a):%d\tsizeof(a):%d\ta:%s\n", strlen(a), sizeof(a), a);
printf("strlen(b):%d\tsizeof(b):%d\tb:%s\n", strlen(b), sizeof(b), b);
printf("strlen(c):%d\tsizeof(c):%d\tc:%s\n", strlen(c), sizeof(c), c);
printf("strlen(d):%d\tsizeof(d):%d\td:%s\n", strlen(d), sizeof(d), d);
printf("strlen(f):%d\tsizeof(f):%d\td:%s\n", strlen(f), sizeof(f), f);
return 0;
}
strlen()——C语言string.h中的函数,遇'\0'截止,但统计长度并不包括'\0',只统计非'\0'的字符个数
sizeof()——C语言运算符,计算()内的变量所属数据类型所占内存的字节数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char b[] = { '1','a','2','b' };
b++;//非法操作
b--;//非法操作
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char b[] = { '1','a','2','b' };
char *p = NULL;
p = b;
p++;
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
src 源字符串
dst 目标地址
*/
int str_copy1(char *dst, char *src)
{
for (; *src != '\0'; src++, dst++)
{
*dst = *src;
}
*dst = '\0';
return 0;
}
int str_copy2(char *dst, char *src)
{
for (; *src != '\0';)
{
*dst++ = *src++; // *dst = *src, dst++, src++
}
*dst = '\0';
return 0;
}
int str_copy3(char *dst, char *src)
{
// src: "1234567\0"
// dst: 1234567\0
for (; (*dst = *src) != '\0'; )
{
src++;
dst++;
}
return 0;
}
int str_copy4(char *dst, char *src)
{
// for (; (*dst++ = *src++););
while ((*dst++ = *src++));
return 0;
}
int str_copy5(char* const dst, char* const src)
{
//传址调用时,不要轻易改变形参指向,可引入一辅助指针变量,将形参值接过来
char* tmpdst = dst;//1
char* tmpsrc = src;//2
if (tmpdst == NULL || tmpsrc == NULL) //增加判断,防止向(从)空地址拷贝字符
return -1;
while ( *tmpdst++ = *tmpsrc++ );
printf("%s\n", dst);//如果没有1 2 直接修改指针所指内容,会出错。
printf("%s\n", src);//如果没有1 2 直接修改指针所指内容,会出错。
return 0;
}
// 0x00000000 ---> NULL ---> 0
// '\0' ---> 0
// '0' ---> 48
int main(void)
{
char *str = "123456789";
char dst[128] = { 0 };
//char *dst = NULL;
if( str_copy5(dst, str) )
printf("str_copy5(dst, str) error!\n");
printf("dst:%s\n", dst);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//strstr(母串, 子串)
//统计 子串在母串的个数
int get_sub_str_count(char *src, char *sub_str)
{
char *p = src;
int cnt = 0;
if (src == NULL || sub_str == NULL)
{
fprintf(stderr, "(src == NULL || sub_str == NULL\n");
return -1;
}
while ((p = strstr(p, sub_str)) != NULL)
{
//找到了子串
cnt++;
p += strlen(sub_str);
if (*p == '\0')
break;
}
return cnt;
}
int get_sub_str_count2(char *src, char *sub_str, int *cnt_p)
{
char *p = src;
int cnt = 0;
if (src == NULL || sub_str == NULL)
{
fprintf(stderr, "(src == NULL || sub_str == NULL\n");
return -1;
}
while ((p = strstr(p, sub_str)) != NULL)
{
//找到了子串
cnt++;
p += strlen(sub_str);
if (*p == '\0')
break;
}
*cnt_p = cnt;
return 0;
}
int main(void)
{
char *str = "21321321312312itcaste21jdisaodjaitcastu34jsioadjitcastdjsaiodjaitcast123itcast";
char *sub_str = "itcast";
int cnt = 0;
cnt = get_sub_str_count(str, sub_str);
if (cnt < 0)
{
fprintf(stderr, "get_sub_str_count err\n");
return -1;
}
printf("cnt = %d\n", cnt);
cnt = 0;
if (get_sub_str_count2(str, sub_str, &cnt) < 0)
{
fprintf(stderr, "get_sub_str_count2 err\n");
return -1;
}
printf("cnt = %d\n", cnt);
return 0;
}
#if 0
int main(void)
{
char *str = "21321321312312itcaste21jdisaodjaitcastu34jsioadjitcastdjsaiodjaitcast123itcast";
char *sub_str = "itcast";
char *p = str;
int cnt = 0;
while ((p = strstr(p, sub_str)) != NULL)
{
//找到了子串
cnt++;
p += strlen(sub_str);
if (*p == '\0') {
break;
}
}
printf("cnt = %d\n", cnt);
return 0;
}
#endif
#if 0
//查找子串 do-while
int main(void)
{
char *str = "21321321312312itcaste21jdisaodjaitcastu34jsioadjitcastdjsaiodjaitcast123";
// ↑
char *sub_str = "itcast";
char *p = NULL;
int cnt = 0; //统计的个数
p = str;
//do -while
do {
p = strstr(p, sub_str);
if (p != NULL) {
//找到了一个
cnt++;
p++;
}
} while (p != NULL);
printf("cnt = %d\n", cnt);
return 0;
}
#endif
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int trimSpace(char* const inbuf, char* const outbuf)
{
char *tmpsrc = inbuf; //源串
char *tmpdec = outbuf; //目的串
if (tmpsrc == NULL || tmpdec == NULL)
{
printf("函数trimSpace()中(tmpsrc == NULL || tmpdec == NULL)运行出错!\n");
return -1;
}
while ( (*tmpsrc) != '\0' )
{
if( (*tmpsrc) != ' ' )
*tmpdec++ = *tmpsrc;
tmpsrc++;
}
*tmpdec = '\0';
return 0;
}
int main()
{
char *src = " abcdefgdddd ";
char *dec = (char*)malloc(sizeof(" abcdefgdddd "));
if (dec == NULL)
{
printf("申请内存失败!\n");
return 0;
}
printf("源串:%s!\n", src); //为明显在末尾加一!
if (trimSpace(src, dec))
{
printf("trimSpace(src, dec) execute error!\n");
}
printf("结果:%s!\n", dec); //为明显在末尾加一!
if (dec != NULL) //释放堆内存
{
free(dec);
dec = NULL;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int trimSpace(char *inbuf, char *outbuf)
{
int i = 0;
int j = 0;
int len = 0;
if (inbuf == NULL || outbuf == NULL) {
fprintf(stderr, " (inbuf == NULL || outbuf == NULL)\n ");
return -1;
}
j = strlen(inbuf) - 1;
//左边开始遍历
while (isspace(inbuf[i]) && inbuf[i] != '\0')
i++;
//右边
while (isspace(inbuf[j]) && j > i)
j--;
len = j - i + 1;
strncpy(outbuf, inbuf + i,len);
outbuf[len] = '\0';
return 0;
}
int main(void)
{
char *str = " abcdefgdddd ";
char buf[128] = { 0 };
if (trimSpace(str, buf) < 0)
return -1;
printf("buf: [%s]\n", buf);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int getStr1Str2(char* const souce, char* const buf1, char* const buf2)
{
char *tmpsrc = souce; //源串
char *tmpdec1 = buf1; //目的串1
char *tmpdec2 = buf2; //目的串2
int flag = 0;//判断奇偶 0为偶 1为奇
if (souce == NULL || buf1 == NULL || buf2 == NULL)
{
printf("函数getStr1Str2()中(souce == NULL || buf1 == NULL || buf2 == NULL)运行出错!\n");
return -1;
}
while ( (*tmpsrc) != '\0' )
{
if (flag == 0)
{
*tmpdec1++ = *tmpsrc++;
flag = 1;
}
if (flag == 1)
{
*tmpdec2++ = *tmpsrc++;
flag = 0;
}
}
*tmpdec1 = '\0';
*tmpdec2 = '\0';
return 0;
}
int main()
{
char *src = "a1b2c3d4e5f6g7h8i9";
char *dec1 = (char*)malloc(sizeof(" abcdefgdddd "));
char *dec2 = (char*)malloc(sizeof(" abcdefgdddd "));
if (dec1 == NULL || dec2 == NULL)
{
printf("申请内存失败!\n");
return 0;
}
printf("源串:%s\n", src);
if (getStr1Str2(src, dec1, dec2))
{
printf("getStr1Str2(src, dec1, dec2) execute error!\n");
}
printf("奇数串:%s\n", dec1);
printf("偶数串:%s\n", dec2);
if (dec1 != NULL) //释放堆内存
{
free(dec1);
dec1 = NULL;
}
if (dec2 != NULL) //释放堆内存
{
free(dec2);
dec2 = NULL;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*不使用全局变量*/
int inverse2(char *src, char *outbuf) //outbuf = outbuf
{
if (src == NULL || outbuf == NULL)
return -1;
if (*src == '\0')
return 0;
inverse2(src + 1, outbuf);
strncat(outbuf, src, 1);
return 0;
}
/*使用全局变量*/
char g_buf[128] = { 0 };
//倒叙打印str字符串
int inverse(char *str)
{
if (str == NULL)
return -1;
if (*str == '\0')
return 0;
inverse(str + 1);//bcdefg
//printf("%c", *str);
strncat(g_buf, str, 1);
return 0;
}
int main(void)
{
char str[] = "abcdefghi";
char out_buf[128] = { 0 };
inverse(str); //abcdefg
printf("g_buf : %s\n", g_buf);
//printf("str : %s\n", str);
inverse2(str, out_buf);
printf("out_buf : %s\n", out_buf);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int inverse(char *str)
{
char *begin = str;
char *end = str + strlen(str) - 1;
char tmp = 0;
if (str == NULL)
{
fprintf(stderr, " str == NULL\n");
return -1;
}
while (end > begin)
{
tmp = *end;
*end = *begin;
*begin = tmp;
begin++;
end--;
}
return 0;
}
int main(void)
{
char str[] = "abcdefghi";
char out_buf[128] = { 0 };
inverse(str); //abcdefg
printf("g_buf : %s\n", g_buf);
//printf("str : %s\n", str);
inverse2(str, out_buf);
printf("out_buf : %s\n", out_buf);
return 0;
}
int getKeyByValude(char* keyvaluebuf, char* keybuf, char* valuebuf, int* valuebuflen);
int main()
{
getKeyByValude("key1 = valude1", "key1", buf, &len);
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int trimSpace(char* const inbuf, char* const outbuf)
{
char *tmpsrc = inbuf; //源串
char *tmpdec = outbuf; //目的串
if (tmpsrc == NULL || tmpdec == NULL)
{
printf("函数trimSpace()中(tmpsrc == NULL || tmpdec == NULL)运行出错!\n");
return -1;
}
while ( (*tmpsrc) != '\0' )
{
if( (*tmpsrc) != ' ' )
*tmpdec++ = *tmpsrc;
tmpsrc++;
}
*tmpdec = '\0';
return 0;
}
int getKeyByValude(char *keyvaluebuf, char *keybuf, char *valuebuf, int* valuebuflen)
{
char *p;
if(NULL == keyvaluebuf || NULL == keybuf || NULL == valuebuf || NULL == valuebuflen)
{
return -1;
}
//查看源串中是否有键
p = strstr(keyvaluebuf, keybuf);
if (p == NULL)
return -1;
//检查等号
p = strstr(keyvaluebuf, "=");
p++;
//删除值中左右空格
trimSpace(p, valuebuf);
*valuebuflen = strlen(valuebuf);
return 0;
}
int main()
{
char keyvaluebuf[] = "key3 = valude3 ";
char keybuf[] = "key3";
char valuebuf[128];
int valuebuflen = 0;;
getKeyByValude(keyvaluebuf, keybuf, valuebuf, &valuebuflen);
printf("源串:%s\n", keyvaluebuf);
printf("键:%s\n", keybuf);
printf("值:%s\n", valuebuf);
printf("值长:%d\n", valuebuflen);
return 0;
}
要求:
1. 正确实现接口和功能
2. 编写测试用例
/*
src: 原字符串
dst: 成的或需要填充的字符串
sub: 需要查找的字符串
new_sub:提换的新字符串
return: 0 成功 -1 失败
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int replaceSubstr(/*in*/char *src, /*out*/char** dst, /*in*/char *sub, /*in*/char *new_sub)
{
char *out = NULL;
char *p = NULL;
char *q = NULL;
int sub_len = 0;
int new_sub_len = 0;
if (src == NULL || dst == NULL || sub == NULL || new_sub == NULL)
{
fprintf(stderr, "(src == NULL || dst == NULL || sub == NULL || new_sub == NULL)\n");
return -1;
}
out = (char*)malloc(sizeof(char) * 4096);
if (out == NULL)
{
fprintf(stderr, "malloc out error\n");
return -1;
}
memset(out, 0, 4096);
p = src;
q = p;
sub_len = strlen(sub);
new_sub_len = strlen(new_sub);
while ((p = strstr(p, sub)) != NULL)
{
//找到了子串
strncat(out, q, p - q);
strncat(out, new_sub, new_sub_len);
p += sub_len;
q = p;
if (*p == '\0')
{
break;
}
}
if (*q != '\0')
{
strncat(out, q, (src + strlen(src) - q));
}
*dst = out;
return 0;
}
int main(void)
{
char *str = "abcd213213abcddjisoabcd2131abcd";
char *dst = NULL;
replaceSubstr(str, &dst, "abcd", "X");
printf("dst: %s\n", dst);
return 0;
}
快速解决matlab出现错误使用mex,未找到支持的编译器或 SDK的提示matlab: mex命令提示找不到编译器或SDK参考博客:https://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/63295746?utm_source=blogxgwz1相比网上其他的答案,这才是问题的本质!!!个人补充对于系统没有安装C++或者G++系统软件..._matlab link : fatal error lnk1181
一、需求说明 经过一段时间的运行,开发数据库的mysql-slow.log文件已经比较大,为了释放磁盘空间,需要对该文件进行清理。mysql-slow.log文件是记录sql语句的执行时间超过设置的long_query_time的语句,默认1秒钟,可以根据数据库实例进行调整设置。二、处置步骤..._mysql-slow.log
R6 IP 为主要的服务ip service IP VIP ,Scan IP 为虚拟ip,这是挂在服务ip下方的。 在RAC架构下,有两个node,VIP ,ScanIP就是虚拟的IP,可以随便起在任何一个node Scan IP则是后来为了做single client access 的ip VIP ,ScanIP因为是虚拟的ip,所以都可以随着硬件状况在不同的服务IP下漂移的。 基于这种_scanip和vip的关系
H5与企业微信jssdk集成https://www.cnblogs.com/yfrs/p/weixinh5.html
Class.getSimpleName()的作用,转载地址:http://blog.sina.com.cn/s/blog_6e0c17b901010f0d.htmlpublic class sample{public static void main(String[] args){//得到类的简写名称System.out.println(sample.class.getSimp..._class.getsimpname
控制台连接MySQL步骤打开控制台输入mysql -uroot -p,回车再输入密码输入show databases;查看有哪些数据库。输入use 数据库名; 进入指定的数据库输入 show tables;进入表输入 select * from user;测试一下。总结:登录==>显示可用的库==>进入指定的库==>显示可用的表==>操作表..._控制台访问mysql
category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用 它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssoc...
//联系人:石虎 QQ: 1224614774 昵称:嗡嘛呢叭咪哄一、概念/** * \@onExit defines some code to be executed when the current scope exits. The * code must be enclosed in braces and terminated with a se
SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信协议,它由一个主设备(Master)和一个或多个从设备(Slave)组成,其中主设备启动与从设备的同步通信,从而完成数据的交换。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,一般需要4根线,事实上3根也可以。MISO主设备数据输入,从设备数据输出。MOSI主设备数据输出,从设备数据输入。SCLK同步时钟信号,由主设备产生。CS从设备使能信号,由主设备控制。_spi是全双工还是半双工
本文转载自:http://blog.csdn.net/beyondioi/article/details/6994548Alsa是Linux高级音频接口。面对众多的音频设备,Alsa为Linux音频开发人员提供了一套标准的访问机制,使得音频开发变得十分容易。不信?下面我们就利用它编写一个简单的录音/播音程序,不过这需要你有一定的计算机语言基础。一个典型的音频程序应该具有以下结构:打开音频设...
今天在对一个表生成映射文件的时候,都出现“generating artifacts"的问题,查看workspace\.metadata\.log,会发现错误原因:org.hibernate.exception.GenericJDBCException: Getting database metadata at org.hibernate.exception.SQLStateConver
这种提示的原因是 文件找不到;只需要如上图,修改build.gradle文件,就行;附上Android Studio 创建AIDL以及AIDL声明的注意事项: 使用这种方式,可以快速创建,AIDL接口,并且无任务错误;但是,如果你在这个aidl文件中, 引用了自定义的类型;那么坑, 就在等着你;首先: 创建一个自定义的类型: 其次创建一个和类名一样的dial文件,内容如下: 之后必须手动导入_aidl should be declared in a file called