【问题标题】:wscanf() behaving differently than scanf() when taking inputwscanf() 在接受输入时的行为与 scanf() 不同
【发布时间】:2019-10-20 16:17:01
【问题描述】:

我有一个简单的程序,它将用户输入作为字符串并输出输入的字符串。唯一的区别是我为用户提供了两个选项,

首先输入一个基本字符串

第二次输入一个宽字符串

scanf() 成功接受用户输入的基本字符串,但 wscanf() 不提示用户输入并直接退出。

为什么这发生在 wscanf() 而不是 scanf() ?我将如何在同一程序中从 wscanf() 获取用户输入字符串。

#include <stddef.h>
#include <stdio.h>
#include <wchar.h>

void basic()
{
    char str[100];
    printf("Enter string with basic string char: ");
    scanf("%s", str);
    printf("Entered string : %s \n", str);
}

void wide()
{
    wchar_t str[100];
    wprintf(L"Enter string with wide string char: ");
    wscanf(L"%ls", str);
    wprintf(L"Entered string : %ls \n", str);
}


int main(int argc, char **argv)
{
    int option = 1;
    printf("\n Basic string (char*) vs Wide string (wchar_t*) \n\n");
    printf("1. Basic string \n2. Wide string \n");
    printf("Enter choice : ");
    scanf("%d", &option);
    switch(option)
    {
    case 1:
        basic();
        break;
    case 2 :
        wide();
        break;
    default:
        printf("Invalid choice \n");
    }

    return 0;
} 

输出:

1.基本字符串:

Basic string (char*) vs Wide string (wchar_t*) 

1. Basic string 

2. Wide string 

Enter choice : 1

Enter string with basic string char: hello

Entered string : hello 

2。宽字符串:

Basic string (char*) vs Wide string (wchar_t*) 

1. Basic string 

2. Wide string 

Enter choice : 2

【问题讨论】:

  • 查看wscanf的返回值。此外,最好提供您的编译器和系统的详细信息,因为宽字符串函数实现已经(并且仍然)有很多种类,通常不遵循标准

标签: c string scanf c-strings widestring


【解决方案1】:

wscanf() behaving differently than scanf() when taking input

方向。

代码第一次使用stdinscanf("%d", &amp;option) 建立一个面向字节的流

使用wscanf(L"%ls", str); 之后是UB。坚持一个方向或重新打开文件。

每个流都有一个方向。在流与外部文件关联之后,但 在对其执行任何操作之前,流是没有方向的。一旦宽 字符输入/输出功能已应用于无方向的流, 流变成了面向广泛的流。类似地,一旦一个字节输入/输出函数具有 被应用到一个没有方向的流上,这个流就变成了一个面向字节的流。 只有调用 freopen 函数或 fwide 函数才能改变 流的方向。 (成功调用 freopen 会删除任何方向。) C11 §7.21.2 4.

类似问题适用于stdout

【讨论】:

    【解决方案2】:

    第一个scanf() 命令scanf("%d", &amp;option);stdin 中留下\nwscanf() 正在捕获。我认为这就是导致错误的原因。一周前我遇到了类似的问题。你可以阅读更多关于它的信息here,在那里你可以找到我得到的好的答案和解决方法。

    您可以在scanf() 之后放置getchar() 以取出\n 或完全避免使用scanf() 并使用替代方案,例如sscanf().

    【讨论】:

    • 但它适用于 scanf() 而不是 wscanf()。其次,我在 wscanf() 之前放置了一个 getchar() 并且它不接受输入。
    • %s 跳过前导空格,所以这可能不是问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多