小编Loc*_*000的帖子

C++错误:转换为执行字符集

问题是我试图在ASCII之外打印一些字符,如德语变音字符,'ß'等.这些字符不适合普通的char变量,所以显然我试图将它们放在wchar_t中并用L"....."初始化字符串.但是每次这个字符串包含上面的字符时,我都会得到上面提到的错误,但是对于ASCII的所有其他字符它都没问题.这也发生在u"....",U"......",如果我使用u8"....."它不会产生错误但会打印垃圾.

那么问题:

  1. 如何从ASCII集外部打印此字符和其他字符?
  2. 无论如何这是什么错误,它是什么意思?
  3. 我可以打印字符的唯一方法是通过调用setlocale()将语言环境设置为环境默认值(德语),然后只需创建一个包含此字符的普通数组就不会产生错误并正确打印,这里的问题是为什么!! 我完全不明白为什么现在这样做,因为char类型的大小没有改变所以我不假设这个调用setlocale()改变默认字符集中的字符映射(通常是ASCII).
  4. 如果有人可以对主题字符集以及如何在C++和C中处理它们提供更多的解释,那么我会特别感谢UTF-8,16,32(你不必自己编写)甚至其他一些组织良好,相对容易理解的网站,更彻底地解决这个问题非常受欢迎).

请求示例:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    wstring x = L"öäüß" ;

    wcout << x ;

    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

这会打印错误.

#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main(void)
{

    setlocale(LC_ALL,""); // sets locale to german on my computer
    string x = "äöüß" ;

    cout << x ;

    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常.但即使在更改语言环境后,如果我创建第一个代码,也会生成错误.

注意:我注意到在C++(而不是C)中,即使没有包含除iostream之外的任何文件,也会声明其他文件的所有内容,如字符串或语言环境或标准库中的任何其他文件,并且在std命名空间中.我暂时忽略了这一点,仍然包含文档文件,但为什么会发生这种情况.(我使用的是tdm-gcc 64bit)

c c++ string

5
推荐指数
1
解决办法
1188
查看次数

了解C语言中的缓冲

我很难理解缓冲的深度,特别是在C编程中,我已经在这个主题上搜索了很长时间,但直到现在还没有找到令人满意的东西.

我将更具体一点:我确实理解它背后的概念(即通过不同硬件设备协调操作并最大限度地降低这些设备的速度差异)但我希望对这些以及缓冲的其他潜在原因有更全面的解释. (并且完全是指越长越好越好)给出一些具体的I/O流中如何实现缓冲的例子也是非常好的.

其他问题是我注意到缓冲区刷新中的一些规则并不像我的程序那样奇怪,因为这听起来像下面的简单片段:

#include <stdio.h>

int main(void)
{
    FILE * fp = fopen("hallo.txt", "w");

    fputc('A', fp);
    getchar();
    fputc('A', fp);
    getchar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序旨在证明当第一个getchar()被调用时,即将发生的输入将立即刷新任意流,但这并不像我尝试的那样经常发生并且我想要的修改次数很多 - 它根本不会发生至于stdout(printf()例如)流被刷新而没有任何输入请求也否定了规则因此我是错误理解这个规则还是有其他需要考虑

我在Windows 8.1上使用Gnu GCC.

更新:

我忘了问我在一些网站上读过人们如何将字符串文字称为缓冲区甚至数组作为缓冲区; 这是正确的还是我错过了什么?请解释这一点.

c windows gcc

1
推荐指数
1
解决办法
548
查看次数

C++保存成员函数setf()的返回值

简而言之

#include <iostream>

using namespace std ;

int main()
{
    ios_base::fmtflags initial ;

    cout << 10 << ' ' << 15.0 << '\n' ;
    initial = cout.setf(ios_base::fixed);
    cout << 10 << ' ' << 15.0 << '\n' ;
    cout.setf(initial);
    cout << 10 << ' ' << 15.0 << '\n' ;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码应生成以下输出:

10 15
10 15.000000
10 15
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.它产生的是:

10 15
10 15.000000
10 15.000000
Run Code Online (Sandbox Code Playgroud)

显然,调用setf并将initial作为其参数是不正确的.

有什么问题?

c++

0
推荐指数
1
解决办法
76
查看次数

标签 统计

c ×2

c++ ×2

gcc ×1

string ×1

windows ×1