Sprintf_s 给我奇怪的盒子而不是字符串
Sprintf_s giving me weird boxes instead of strings
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "resource.h"
char* getString(HWND hwnd,int dlgItem)
{
int len = GetWindowTextLength(GetDlgItem(hwnd, dlgItem));
if (len > 0)
{
TCHAR szBuffer[128] = { 0 };
int s = GetDlgItemText(hwnd, dlgItem, szBuffer, len + 1);
return szBuffer;
}
return "";
}
int getInt(HWND hwnd, int dlgItem)
{
int len = GetWindowTextLength(GetDlgItem(hwnd, dlgItem));
if (len > 0)
{
BOOL bsuccess;
int Number = GetDlgItemInt(hwnd, dlgItem, &bsuccess, FALSE);
return Number;
}
return 0;
}
char* _personRecord(HWND hwnd)
{
int nameLength = GetWindowTextLength(GetDlgItem(hwnd, txtName)) + 1;
int addressLength = GetWindowTextLength(GetDlgItem(hwnd, txtAddress)) + 1;
int phoneLength = GetWindowTextLength(GetDlgItem(hwnd, txtPhone)) + 1;
int emailLength = GetWindowTextLength(GetDlgItem(hwnd, txtEmail)) + 1;
char* name = malloc(nameLength);
name = getString(hwnd, txtName);
int age = getInt(hwnd, txtAge);
char* address = malloc(addressLength);
address = getString(hwnd, txtAddress);
int zip = getInt(hwnd, txtZip);
char* phone= malloc(phoneLength);
phone = getString(hwnd, txtPhone);
char* email = malloc(emailLength);
email = getString(hwnd, txtEmail);
int length = nameLength + addressLength + phoneLength + emailLength + age + zip;
char* personRecord = malloc(length);
sprintf_s(personRecord , length, "Name: %s\nAge: %d\nAddress: %s\nZip: %d\nPhone: %s\nEmail: %s\n", name, age, address, zip, phone, email);
OutputDebugString("\nStart*********\n");
OutputDebugString(personRecord);
OutputDebugString("\nEnd**********\n");
return personRecord;
free(name);
free(address);
free(phone);
free(email);
free(personRecord);
}
void saveFile(char* record)
{
FILE* fp = NULL;
if(fopen_s(&fp,"contacts.txt", "a") == 0)
{
fprintf(fp, "\n");
fprintf(fp, record);
fclose(fp);
}
else
{
OutputDebugString("Op failed");
}
}
//Works 100 percent.
void clear(HWND hwnd)
{
SetDlgItemText(hwnd, txtName, "");
SetDlgItemText(hwnd, txtAge, "");
SetDlgItemText(hwnd, txtAddress, "");
SetDlgItemText(hwnd, txtZip, "");
SetDlgItemText(hwnd, txtPhone, "");
SetDlgItemText(hwnd, txtEmail, "");
}
BOOL CALLBACK EventHandler(HWND holdWindow, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case btnSave:
saveFile(_personRecord(holdWindow));
clear(holdWindow);
break;
case btnLoad:
//print all records to console
break;
case btnClose:
EndDialog(holdWindow, 0);
}
break;
case WM_CLOSE:
EndDialog(holdWindow, 0);
break;
default:
return FALSE;
}
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, EventHandler);
}
第一次真正破解 C 程序,它确实做了任何值得注意的事情。我确定我在内存管理方面犯了很多错误,但我是新手所以请放轻松。就我的问题而言,当我将这些字符串打印出来并将它们保存到文件中时,sprintf 会将这些字符串转换成框。
我认为可能是我的 getString 方法导致了这个问题,但是如果我在调用它之后打印出一个变量,它在调试中工作正常。
我已经尝试多次调整我分配 personRecord 的方式,包括将其设为静态和 NULL。我也试过单独打印它们。
我现在完全不知所措。
char* szBuffer[1024] = { 0 };
TCHAR 类型错误,128 内存不足以正确保存字符串。我调整了可以使用多少内存并解决了这个问题。我认为正确的答案是将数据 malloc 到我从 window 中获取的字符串的长度,但我不完全确定。
感谢所有发帖的人。
char* getString(HWND hwnd,int dlgItem)
{
int len = GetWindowTextLength(GetDlgItem(hwnd, dlgItem));
if (len > 0)
{
char* record = malloc(len * sizeof *record + 1);
int s = GetDlgItemText(hwnd, dlgItem, record, len + 1);
return record;
free(record);
}
return "";
}
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "resource.h"
char* getString(HWND hwnd,int dlgItem)
{
int len = GetWindowTextLength(GetDlgItem(hwnd, dlgItem));
if (len > 0)
{
TCHAR szBuffer[128] = { 0 };
int s = GetDlgItemText(hwnd, dlgItem, szBuffer, len + 1);
return szBuffer;
}
return "";
}
int getInt(HWND hwnd, int dlgItem)
{
int len = GetWindowTextLength(GetDlgItem(hwnd, dlgItem));
if (len > 0)
{
BOOL bsuccess;
int Number = GetDlgItemInt(hwnd, dlgItem, &bsuccess, FALSE);
return Number;
}
return 0;
}
char* _personRecord(HWND hwnd)
{
int nameLength = GetWindowTextLength(GetDlgItem(hwnd, txtName)) + 1;
int addressLength = GetWindowTextLength(GetDlgItem(hwnd, txtAddress)) + 1;
int phoneLength = GetWindowTextLength(GetDlgItem(hwnd, txtPhone)) + 1;
int emailLength = GetWindowTextLength(GetDlgItem(hwnd, txtEmail)) + 1;
char* name = malloc(nameLength);
name = getString(hwnd, txtName);
int age = getInt(hwnd, txtAge);
char* address = malloc(addressLength);
address = getString(hwnd, txtAddress);
int zip = getInt(hwnd, txtZip);
char* phone= malloc(phoneLength);
phone = getString(hwnd, txtPhone);
char* email = malloc(emailLength);
email = getString(hwnd, txtEmail);
int length = nameLength + addressLength + phoneLength + emailLength + age + zip;
char* personRecord = malloc(length);
sprintf_s(personRecord , length, "Name: %s\nAge: %d\nAddress: %s\nZip: %d\nPhone: %s\nEmail: %s\n", name, age, address, zip, phone, email);
OutputDebugString("\nStart*********\n");
OutputDebugString(personRecord);
OutputDebugString("\nEnd**********\n");
return personRecord;
free(name);
free(address);
free(phone);
free(email);
free(personRecord);
}
void saveFile(char* record)
{
FILE* fp = NULL;
if(fopen_s(&fp,"contacts.txt", "a") == 0)
{
fprintf(fp, "\n");
fprintf(fp, record);
fclose(fp);
}
else
{
OutputDebugString("Op failed");
}
}
//Works 100 percent.
void clear(HWND hwnd)
{
SetDlgItemText(hwnd, txtName, "");
SetDlgItemText(hwnd, txtAge, "");
SetDlgItemText(hwnd, txtAddress, "");
SetDlgItemText(hwnd, txtZip, "");
SetDlgItemText(hwnd, txtPhone, "");
SetDlgItemText(hwnd, txtEmail, "");
}
BOOL CALLBACK EventHandler(HWND holdWindow, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case btnSave:
saveFile(_personRecord(holdWindow));
clear(holdWindow);
break;
case btnLoad:
//print all records to console
break;
case btnClose:
EndDialog(holdWindow, 0);
}
break;
case WM_CLOSE:
EndDialog(holdWindow, 0);
break;
default:
return FALSE;
}
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, EventHandler);
}
第一次真正破解 C 程序,它确实做了任何值得注意的事情。我确定我在内存管理方面犯了很多错误,但我是新手所以请放轻松。就我的问题而言,当我将这些字符串打印出来并将它们保存到文件中时,sprintf 会将这些字符串转换成框。 我认为可能是我的 getString 方法导致了这个问题,但是如果我在调用它之后打印出一个变量,它在调试中工作正常。 我已经尝试多次调整我分配 personRecord 的方式,包括将其设为静态和 NULL。我也试过单独打印它们。 我现在完全不知所措。
char* szBuffer[1024] = { 0 };
TCHAR 类型错误,128 内存不足以正确保存字符串。我调整了可以使用多少内存并解决了这个问题。我认为正确的答案是将数据 malloc 到我从 window 中获取的字符串的长度,但我不完全确定。 感谢所有发帖的人。
char* getString(HWND hwnd,int dlgItem)
{
int len = GetWindowTextLength(GetDlgItem(hwnd, dlgItem));
if (len > 0)
{
char* record = malloc(len * sizeof *record + 1);
int s = GetDlgItemText(hwnd, dlgItem, record, len + 1);
return record;
free(record);
}
return "";
}