字符串[3]:自定义函数实现字符串API操作(2)

原创首发于CSDN,转载请注明出处,谢谢!


前言

对于笔者上一篇博客 字符串 [2]:定义函数实现字符串API操作(1) 所遗留的6个字符串函数的补充。


自定义函数实现字符串API操作(2)

|strlwr() —— myStrlwr()

函数原型:

#include <stdio.h>
char *strlwr(char *src);

演示代码: myStrlwr.c

/* myStrlwr.c */
#include <stdio.h>
#include <ctype.h>//抽空研究下 ctype.h 这个头文件。

char *myStrlwr(char *p)
{
        int i = 0;
        while(p[i] != '\0'){
        		//int tolower(int c),字符转换为小写字符。
                putchar(tolower(p[i]));
                i++;
        }
}

int main()
{
        char str[] = "ABCDE";
        printf("%s\n",str);

        myStrlwr(str);   
        putchar('\n');
        return 0;
}

运行结果:
myStrlwr.c

|strupr() —— myStrupr()

函数原型:

#include <stdio.h>
char *strupr(char *src);

演示代码: myStrupr()

/* myStrupr.c */
#include <stdio.h>
#include <ctype.h>

char *myStrupr(char *p)
{
        int i = 0;
        while(p[i] != '\0')
        {
        		//int toupper(int c)
        		//字符转换为大写字符。
                putchar(toupper(p[i]));
                i++;
        }
}

int main()
{
        char str[] = "abcde";
        printf("%s\n",str);

        myStrupr(str);
        putchar('\n');
        return 0;
}

运行结果:
myStrupr.c

|strchr() —— myStrchr()

函数原型:

#include <stdio.h>
char *strchr(char *src, const char c);

演示代码: myStrchr.c

/* myStrchr.c */
#include <stdio.h>
#include <string.h>

char *myStrchr(char *str, char c)
{
        while(*str != '\0' && *str != c){
                str++;
        }

        if(*str == c){
                return (char *)str;
        }else{
                return NULL;
        }
}

int main()
{
        char p[] = "abcde";
        char ch1 = 'c';
        char ch2 = 'b';
        char *ret = NULL;

        ret = strchr(p,ch1);
        if(ret == NULL){
				printf("The char ch1 does not exist.\n");
		}else{
				printf("strchr ch1: %s\n",ret);		
		}
       
        ret = myStrchr(p,ch2);
        if(ret == NULL){
                printf("The char ch2 does not exist.\n");
        }else{
                printf("myStrchr ch2: %s\n",ret);
        }
        return 0;
}

运行结果:
myStrchr.c

|strstr() —— myStrstr()

函数原型:

#include <stdio.h>
char *strstr(const char *haystack, const char *needle) ;

演示代码: myStrstr.c

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

char *myStrstr(char *dest, char *src)
{
        char *a = dest;
        char *b = src;
        char *ptr = NULL;

        //控制三个指针统一步调,内容被控制为一个字符串内容。
        //好残暴的写法。
        while(*a != '\0')
        {
                ptr = a;
                while((*a != '\0') && (*b != '\0') && (*a == *b))
                {
                        a++;
                        b++;
                }
                if(*b == '\0'){
                        return (char *)ptr;
                }
                a = ptr + 1;
                b = src;
        }
}

int main()
{
        char str[] = "hello,world!";
        char substr1[] = "wor";
        char substr2[] = "ll";
        char *ret = NULL;

        ret = strstr(str,substr1);
        if(ret == NULL){
                printf("No exist.\n");
        }else{
                printf("strstr(str,substr1): %s\n",ret);
        }

        ret = myStrstr(str,substr2);
        if(ret == NULL){
                printf("No exist.\n");
        }else{
                printf("myStrstr(str,substr2): %s\n",ret);
        }
        return 0;
}

运行结果:

在这里插入图片描述

|strcmp() —— myStrcmp()

推荐阅读的博客(建议收藏):strcmp函数实现及分析

|strtok() —— myStrtok()

推荐阅读的博客(建议首收藏):strtok()函数的实现

|字符串逆序(inverse Order)

演示代码: inverse.c

/* inverse.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void inverse(char str[])
{
	int begin;
	int end;
	char tmp;

	begin = 0;
	end   = strlen(str) - 1;

	while(begin < end)
	{
		tmp = str[begin];
		str[begin] = str[end];
		str[end] = tmp;

		end--;
		begin++;	
	}
}

int main()
{
	//char str[128] = {'\0'};
	char *str = NULL;
	str = (char *)malloc(128);
	memset(str,'\0',128);
	
	printf("Input your string:\n");
	scanf("%s",str);
	inverse(str);

	puts("Inverse Order:");
	printf("%s\n",str);
	return 0;
}

参考资料


更新时间记录

  • 文章整体框架搭好。 「2021.5.3 8:27」
  • 各个函数的框架搭好。「2021.5.3 18:24」
  • “strlwr() —— myStrlwr()”一节完成。 「2021.5.3 21:45」
  • “strupr() —— myStrupr()”一节完成。 「2021.5.3 22:00」
  • “strchr() —— myStrchr()”一节完成。 「2021.5.4 14:45」
  • “strstr() —— myStrstr()”一节完成。 「2021.5.4 20:20」
  • 关于函数 strcmp() 、strtok() 的实现直接点击博文链接。 「2021.5.5 13:56」
  • 增加“字符串 Inverse Order”一节。 「2021.6.23 21:51」
  • 修改文章标题格式,修改部分段落内容。「2024.3.27 11:25」
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,你可以使用Windows API函数来模拟键盘输入。下面是一段示例代码,它将使用Windows API函数`SendInput`来模拟按下自定义字符串: ```csharp using System; using System.Runtime.InteropServices; // 导入Windows API函数 [DllImport("user32.dll", SetLastError = true)] static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); // 定义INPUT结构体 [StructLayout(LayoutKind.Sequential)] struct INPUT { public int type; public InputUnion u; public static int Size { get { return Marshal.SizeOf(typeof(INPUT)); } } } // 定义InputUnion结构体 [StructLayout(LayoutKind.Explicit)] struct InputUnion { [FieldOffset(0)] public MOUSEINPUT mi; [FieldOffset(0)] public KEYBDINPUT ki; [FieldOffset(0)] public HARDWAREINPUT hi; } // 定义KEYBDINPUT结构体 [StructLayout(LayoutKind.Sequential)] struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } // 模拟键盘输入 public static void SendKeys(string keys) { // 将字符串转换为字符数组 char[] chars = keys.ToCharArray(); // 创建INPUT结构体数组 INPUT[] inputs = new INPUT[chars.Length * 2]; // 填充INPUT结构体数组 for (int i = 0; i < chars.Length; i++) { // 模拟按下键 inputs[i * 2].type = 1; inputs[i * 2].u.ki.wVk = 0; inputs[i * 2].u.ki.wScan = (ushort)chars[i]; inputs[i * 2].u.ki.dwFlags = 0x0008; // 模拟释放键 inputs[i * 2 + 1].type = 1; inputs[i * 2 + 1].u.ki.wVk = 0; inputs[i * 2 + 1].u.ki.wScan = (ushort)chars[i]; inputs[i * 2 + 1].u.ki.dwFlags = 0x0008 | 0x0002; } // 调用SendInput函数 uint result = SendInput((uint)inputs.Length, inputs, INPUT.Size); } ``` 在这个示例中,我们使用了Windows API函数`SendInput`来模拟键盘输入。首先,我们将要输入的字符串转换为字符数组。然后,我们创建了一个`INPUT`结构体数组,并使用`for`循环来填充它。每个字符都将模拟按下和释放两个键,这样就可以输入整个字符串了。最后,我们调用`SendInput`函数来发送输入数据。 请注意,使用Windows API函数来模拟键盘输入需要一些Windows编程知识,因此建议仅在必要时使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值