【发布时间】:2022-01-23 17:59:09
【问题描述】:
我正在尝试从用户输入中读取字符串,然后将其打印在屏幕上。但是,当在控制台上打印字符串时,它有点乱码。有趣的是,它在 Visual Studio 中工作,而不是在 CodeBlocks 中。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int i, num_bytes;
char sentence[] = "";
std::cout << "Please enter your name: ";
//fgets(sentence, 100, stdin);
//scanf("%[^\n]%*c", sentence);
//scanf("%[^\n]", sentence);
std::cin >> sentence;
num_bytes = strlen(sentence);
LPVOID ptr = VirtualAlloc(NULL, num_bytes, MEM_RESERVE, PAGE_READWRITE);
ptr = VirtualAlloc(ptr, num_bytes, MEM_COMMIT, PAGE_READWRITE);
if (ptr) {
char* char_ptr = static_cast<char*>(ptr);
for (i = 0; i < num_bytes; i++) {
char_ptr[i] = sentence[i];
}
std::cout << "Allocated Memory Address: " << (void *)ptr << std::endl;
std::cout << "Press Enter to print out the characters.\n";
getchar();
for (i = 0; i < num_bytes; i++) {
std::cout << char_ptr[i];
}
std::cout << "\nPress Enter to clear memory." << std::endl;
getchar();
VirtualFree(ptr, 0, MEM_RELEASE);
} else {
std::cout << "Could not allocate " << num_bytes << " of memory." << std::endl;
}
std::cout << "\nPress Enter to continue." << std::endl;
getchar();
}
【问题讨论】:
-
您是否期望编译器在
sentence下提供无限量的可写存储空间?请改用std::string,忘记预先预留存储空间。 -
char sentence[] = "";为 0 个字符 + 空终止符提供空间。这是一个编译时大小的数组,永远不会从这个大小扩展。 -
使用 std::string 而不是 char[N]。但这就是 VirtualAlloc/VirtualFree 的全部内容。你在做什么?
-
在您扩大数组以接受超过 0 个字符后,您确定输入的人不会输入空格字符吗?请记住,
std::cin >> sentence;将在输入的第一个空白字符处停止读取。 -
是的,我假设输入将包含空格。那么,我该如何解决这个问题呢?
标签: c++ string winapi memory virtualalloc