C检查两个字符串是否相同

时间:2014-08-11 19:28:12

标签: c string winapi

我尝试制作剪贴板记录器。这个想法是每隔5秒钟就会改变剪贴板上文本的程序检查;但问题是,在开始时剪贴板显示两次,之后没有显示任何内容。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <windows.h>

DWORD WINAPI check()
{
    char *strData;
    char *oldData = "";

for(;;){
    OpenClipboard(NULL);
    HANDLE hClipboardData = GetClipboardData(CF_TEXT);
    char *pchData = (char*)GlobalLock(hClipboardData);
    strData = pchData;
    GlobalUnlock(hClipboardData);
    CloseClipboard();

    if(strData == oldData)
    {
        //do nothing
    }
    else
    {
        printf("%s\n", strData); //here its print twice and then nothing what is not the intention
        oldData = strData;
    }

    Sleep(5000);
}
}

int main()
{
    printf("Hello\n");
    printf("Your clipboard:\n");

    HANDLE thread = CreateThread(NULL, 0, check, NULL, 0, NULL);

    getchar();
    return 0;
}

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

你有几个问题......

如果你想保留一个字符串,你需要将它保持为静态,否则变量会在你从该函数返回时丢失。

DWORD WINAPI check()
{
    char *strData;
    static char *oldData = NULL; // here you'd need static and use NULL by default

正如其他人所提到的,比较字符串是用strcmp()或类似方法完成的:

    if(strcmp(strData, oldData) == 0)

但是,现在oldData可以为NULL,您必须验证它是否已分配:

    if(oldData && strcmp(strData, oldData) == 0)

如果给出了一个新字符串,那么您想要释放旧字符串并替换为新字符串:

        if(oldData) free(oldData);
        oldData = strdup(strData);

现在应该可以了。