目前共有22篇帖子。 内容转换:不转换▼
 
点击 回复
934 21
今天,我把C语言课本上第211页的那个程序改成了Windows窗口程序的版本
一派护法 十九级
1楼 发表于:2015-11-28 14:07
运行结果:

一派护法 十九级
2楼 发表于:2015-11-28 14:07
一派护法 十九级
3楼 发表于:2015-11-28 14:08
点击OK按钮后出结果:
一派护法 十九级
4楼 发表于:2015-11-28 14:30

还能支持汉字(因为wchar_t字符数组支持汉字字符)
一派护法 十九级
5楼 发表于:2015-11-28 14:31
一派护法 十九级
6楼 发表于:2015-11-28 14:32
生成的程序文件:

一派护法 十九级
7楼 发表于:2015-11-28 14:33
一派护法 十九级
8楼 发表于:2015-11-28 14:33

详细信息
一派护法 十九级
9楼 发表于:2015-11-28 14:35
程序核心代码:(鼠标点击OK按钮后执行的内容)
void CInsertStrDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    //CDialogEx::OnOK();
    int len1, len2, i, pos;
    UpdateData();
    len1 = mString1.GetLength();
    len2 = mString2.GetLength();

    /* Find the position */
    for (pos = 0; pos < len1; pos++)
    {
        if (mString1.GetAt(pos) == mString2.GetAt(0))
            break; // found;
    }
    // When not found, pos == len1

    /* Move */
    mResult = mString1 + CString(' ', len2 + 1); // lengthen the string
    if (pos != len1)
    {
        for (i = len1; i >= pos - 1 && i >= 0; i--)
        {
            // At first when i == len1, the character is '\0'
            // and then '\0' will be moved to the end
            mResult.SetAt(i + len2 - 1, mString1.GetAt(i));
        }
    }

    /* Copy chars from s2 to s1 */
    // copy the first character of s2
    if (pos == len1)
        mResult.SetAt(len1 + len2, '\0'); // when not found, the moving wasn't executed, so '\0' was not copied
    for (i = 0; i < len2; i++)
        mResult.SetAt(pos + i, mString2.GetAt(i));

    UpdateData(false);
}

其中mString1绑定的是第一个文本框,mString2是第二个文本框,mResult是第三个只读的文本框。
一派护法 十九级
10楼 发表于:2015-11-28 14:36
初始化函数(BOOL CInsertStrDlg::OnInitDialog())中的初始化代码:
    // TODO: Add extra initialization here
    mString1 = "abcdef";
    mString2 = "d45";
    UpdateData(false);
这是在窗口程序启动后默认在两个文本框中显示的内容。
一派护法 十九级
11楼 发表于:2015-11-28 14:37
窗口布局:

一派护法 十九级
12楼 发表于:2015-11-28 14:38
Ctrl + D键设置的Tab键访问顺序:

一定要把第一个文本框的号码设为比其他TAB可切换控件的号码小,这样程序启动后光标才能默认落在第一个文本框中。
一派护法 十九级
13楼 发表于:2015-11-28 14:39
最后一个文本框的Read Only(只读)要设置为True:

一派护法 十九级
14楼 发表于:2015-11-28 14:40

这是给文本框绑定变量的方法。
一派护法 十九级
15楼 发表于:2015-11-28 14:42

Category要选择Value类型,变量类型为CString,变量名为mString1。
窗口上其他的文本框类似。
设置后程序中就可以直接读取文本框中的内容了。
UpdateData();是把文本框中的内容更新到变量中。
UpdateData(false);是把变量中的内容显示到文本框中。
一派护法 十九级
16楼 发表于:2015-11-28 14:42

程序属性值
一派护法 十九级
17楼 发表于:2015-11-28 14:44
一派护法 十九级
18楼 发表于:2015-11-28 14:46
见习魔法师 二级
19楼 发表于:2015-11-28 18:05
可以哦。
一派护法 十九级
20楼 发表于:2015-12-19 10:26
可以用C语言库函数把insert函数改写成更简单且更容易理解的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void insert(char *s1, const char *s2)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int pos;
    char *ch = strchr(s1, *s2);
   
    if (ch == NULL) // when not found
        memcpy(s1 + len1, s2, len2 + 1); // including '\0' at the end
    else
    {
        pos = *ch - *s1;
        memmove(ch + len2 - 1, ch, len1 - pos + 1); // including '\0' at the end
        memcpy(ch, s2, len2);
    }
}

int main(int argc, char *argv[])
{
    char str[50] = "abcdefgh";
    char s2[5] = "d45";
    insert(str, s2);
    puts(str);
   
    strcpy(str, "abcdef");
    strcpy(s2, "45");
    insert(str, s2);
    puts(str);
   
    strcpy(str, "definition");
    strcpy(s2, "desk");
    insert(str, s2);
    puts(str);
   
    return 0;
}
一派护法 十九级
21楼 发表于:2015-12-19 10:26
回复20楼 @巨大八爪鱼 的内容:
可以用C语言库函数把insert函数改写成更简单且更容易理解的版本:
#include <stdio.h>
#include <stdlib.h>...
#include <stdlib.h>
这句话可以不要
一派护法 十九级
22楼 发表于:2015-12-19 10:41
void insert(char *s1, const char *s2)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int pos;
    char *ch = strchr(s1, *s2); // 在s1中查找s2的第一个字符,返回该字符在s1中的位置地址,如果没有找到,返回NULL
   
    if (ch == NULL) // 如果没有找到
        memcpy(s1 + len1, s2, len2 + 1); // 直接把s2字符串连同末尾的\0一起复制到s1[len1]处,也就是s1的字符串结尾处(\0处)
    else
    {
        // 以abcdef, d45为例
        pos = *ch - *s1; // 计算找到的字符d在s1中的位置(数字,从0开始),计算结果为3
        memmove(ch + len2 - 1, ch, len1 - pos + 1); // 移动字符串空出空间。把def\0向右移动len2-1个位置(也就是2个位置),共移动len1 - pos + 1个字节,也就是4个字节。
        memcpy(ch, s2, len2); // 复制字符串。把d45(不含末尾的\0)复制到abc[ded]ef的[ded]处覆盖掉。
        // 其实程序在这里还可以进行修改。因为字符“d”没必要复制
    }
}

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:934 回复数:21
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2015-12-19 10:41
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。