为什么程序不在c中的gets_s()处等待信息



我有一个C程序,在该程序中,我试图将用户输入作为一整行,并写入内存映射文件以实现IPC。奇怪的是,当我使用fgets或StrinCchGetsA时,程序不会等待输入,而是立即跳到下一条指令。如果我使用格式字符串为"%"的scanf_s,这种奇怪的行为就不会发生s";但这会随着第一个空格而停止。如果我使用格式字符串"%[^\n]s";或%[^\n]";为了解释空间,奇怪的行为再次发生。

这是我的主要功能。很简单,用户按1从内存映射文件中读取,或按2向其写入

int main()
{
HANDLE hFMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1 << 16, L"Shared Memory");
if (!hFMap)
{
printf_s("Error: %u", GetLastError());
return 1;
}
else
{
void* p = MapViewOfFile(hFMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if (!p)
{
printf_s("Error getting pointern");
return 1;
}
int ch = 0;
bool quit = false;
while (!quit)
{
printf(">>1 ");
scanf_s("%d", &ch);
switch (ch)
{
case 1:
readMem(p);
break;
case 2:
writeMem(p);
break;
case 0:
quit = true;
break;
}
}
}
return 0;
}

writeMem函数的问题代码如下

void writeMem(void* p)
{
char txt[128];
printf(">>2 ");
fgets(txt, _countof(txt), stdin);
strcpy_s((char*)p, _countof(txt), txt);
}

void writeMem(void* p)
{
char txt[128];
printf(">>2 ");
scanf_s("%[^n]s", txt, _countof(txt));
strcpy_s((char*)p, _countof(txt), txt);
}

它在命令行中显示>>2 >>1,这表明它没有在fgets处停止,并在缓冲区和我的变量ch中写入。

为什么会发生这种情况?

事实证明。scanf和scanf_s将最终的CCD_ 3留在缓冲器中。我只需要在它之后调用getchar来删除它。这个n被fgets从缓冲区读取,导致它停止。

scanf_s("%d", &ch);
getchar();

最新更新