老师未批改
1. 编写一个函数, 参数为获取字符个数, 传入的字符串, 并将获取到的字符存储在外部传入的字符串中, 使用printf输出结果.
程序源代码:
/*************************************************************************
> 文件名: lesson25.hw.01.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com
> 创建时间: 2016-10-10 17:23:39
************************************************************************/
#include <stdio.h>
#define STRLEN 255
int _strncpy(const char* strSource, char* strDist, size_t szBufLen) {
size_t sz = 0;
for (; sz < szBufLen - 1; sz++) {
if (*(strSource + sz) == '\0') {
break;
}
*(strDist + sz) = *(strSource + sz);
}
*(strDist + ++sz) = '\0';
return 0;
}
int main() {
char* str = "1234567890";
printf("当前已经定义的字符串为:[%s]\n", str);
char strDist[STRLEN] = { 0 };
_strncpy(str, strDist, 5);
printf("复制5个后的字符串为:[%s]\n", strDist);
_strncpy(str, strDist, 10);
printf("复制10个后的字符串为:[%s]\n", strDist);
_strncpy(str, strDist, 15);
printf("复制15个后的字符串为:[%s]\n", strDist);
return 0;
}运行效果:
2. 将函数 strchr, strrchr, strstr 函数的功能实现一次.
程序源代码:
/*************************************************************************
> 文件名: lesson25.hw.02.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com
> 创建时间: 2016-10-10 17:51:08
************************************************************************/
#include <stdio.h>
#include <string.h>
char* _strchr(const char* strSrc, char ch) {
int iIndex = 0;
_Bool bFindResult = 0;
char* strResult = NULL;
for (; iIndex < strlen(strSrc); iIndex++) {
if (ch == *(strSrc + iIndex)) {
bFindResult = 1;
break;
}
}
if (bFindResult) {
strResult = strSrc + iIndex;
}
return strResult;
}
char* _strrchr(const char* strSrc, char ch) {
int iIndex = 0;
_Bool bFindResult = 0;
char* strResult = NULL;
for (iIndex = strlen(strSrc) - 1; iIndex >= 0; iIndex--) {
if (ch == *(strSrc + iIndex)) {
bFindResult = 1;
break;
}
}
if (bFindResult) {
strResult = strSrc + iIndex;
}
return strResult;
}
char* _strstr(const char* strSrc, const char* strFind) {
int iIndex = 0;
_Bool bFindResult = 0;
char* strResult = NULL;
for (; iIndex < strlen(strSrc); iIndex++) {
if (strncmp((strSrc + iIndex), strFind, strlen(strFind)) == 0) {
bFindResult = 1;
break;
}
}
if (bFindResult) {
strResult = strSrc + iIndex;
}
return strResult;
}
int main() {
char* strSrc = "Hades Studio http://www.hxhlb.net";
char* strFind = "hxhlb";
printf("测试字符串1为:[%s]\n测试字符串2为[%s]\n\n", strSrc, strFind);
printf("测试_strchr查找字符 'S':[%s]\n", _strchr(strSrc, 'S'));
printf("测试_strchr查找字符 ':':[%s]\n", _strchr(strSrc, ':'));
printf("测试_strchr查找字符 'm':[%s]\n", _strchr(strSrc, 'm'));
printf("测试_strrchr查找字符 't':[%s]\n", _strrchr(strSrc, 't'));
printf("测试_strrchr查找字符 ':':[%s]\n", _strrchr(strSrc, ':'));
printf("测试_strrchr查找字符 'm':[%s]\n", _strrchr(strSrc, 'm'));
printf("\n使用字符串1查找字符串2:[%s]\n", _strstr(strSrc, strFind));
printf("\n使用字符串1查找字符串\"hades\":[%s]\n", _strstr(strSrc, "hades"));
return 0;
}运行效果:

3. 编写一个程序, 实现字符串反转.
程序源代码:
/*************************************************************************
> 文件名: lesson25.hw.03.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com
> 创建时间: 2016-10-10 19:40:42
************************************************************************/
#include <stdio.h>
#include <string.h>
#define STR_LEN 255
int reverseStr(const char* strSrc, char* strDist, size_t szSize) {
int iStrLen = strlen(strSrc) > (szSize - 1) ? szSize - 1 : strlen(strSrc);
char* pStr = strSrc;
int iIndex = 0;
for (; iIndex < iStrLen; iIndex++) {
*(strDist + iStrLen - iIndex - 1) = *(pStr + iIndex);
}
*(strDist + iStrLen + 1) = '\0';
return iIndex;
}
int main() {
char strResult[STR_LEN] = { 0 };
char* strSrc = "Hades Studio http://www.hxhlb.cn";
reverseStr(strSrc, strResult, STR_LEN);
printf("反转字符串[%s]为[%s]\n", strSrc, strResult);
return 0;
}运行效果:

4. 要求用户输入一个简单公式(10+3), 两位数加法, 根据公式计算值.
程序源代码:
/*************************************************************************
> 文件名: lesson25.hw.04.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com
> 创建时间: 2016-10-10 22:46:17
************************************************************************/
#include <stdio.h>
#define STR_LEN 255
long analyzeCalc(const char* str) {
long lResult = 0;
char strs[STR_LEN] = { 0 };
strncpy(strs, str, STR_LEN);
char* end = NULL, end2 = NULL;
int i = 0;
// 删除表达式前的非数字字符
while(*(strs+i) < '0' || *(strs+i) > '9') {
i++;
}
// 获取第一个数字
long a = strtol(strs+i, &end, 10);
printf("%ld ", a);
i = 0;
// 删除除了运算符之外的字符
while(*(end+i) < '0' || *(end+i) > '9') {
if(*(end+i) != '+'
&& *(end+i) != '-'
&& *(end+i) != '*'
&& *(end+i) != '/') {
i++;
} else {
break;
}
}
// 获取运算符
char cCalc = *(end + i);
printf("%c ", cCalc);
// 跳过运算符
end += i + 1;
i = 0;
// 删除第二个操作数前的非数字字符
while(*(end+i) < '0' || *(end+i) > '9') {
i++;
}
// 获取第二个操作数
long b = strtol(end+i, &end2, 10);
printf("%ld\n", b);
printf("解析表达式为[%ld] [%c] [%ld] = \n", a, cCalc, b);
// 开始计算
switch (cCalc) {
case '+':
lResult = a + b;
break;
case '-':
lResult = a - b;
break;
case '*':
lResult = a * b;
break;
case '/':
lResult = a / b;
break;
default:
lResult = 0;
break;
}
return lResult;
}
int main() {
printf("请输入简单的两数四则运算公式(比如 1+2):\n");
char strReader[STR_LEN] = { 0 };
fgets(strReader, STR_LEN, stdin);
long lResult = analyzeCalc(strReader);
printf("计算结果为:[%ld]\n", lResult);
return 0;
}运行效果:

如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2016-10-10 at 04:49 pm
