字符串文字而不转义空字符

时间:2017-06-03 15:21:57

标签: c++

当我构建一个给出半字节(4位)十六进制表示的函数时,我查看了二进制文件,对于数字的查找表,即使没有使用,也会有一个额外的0-char。 / p>

const char digits[] = "0123456789abcdef";

我知道你可以用数组的形式写出来:

const char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

但这需要一段时间才能为更多数字的其他数字系统编写和使用更多磁盘空间。 但有没有办法把它写成文字,但最后没有空字符?

(我正在使用Clang -std=c++14

3 个答案:

答案 0 :(得分:2)

在C中,你可以写

from django.shortcuts import render
from django.http import HttpResponse

from yahoo_finance import Currency

def eurusd (request):
    eur_usd = Currency('EURUSD')
    eur = ('EUR/USD Bid/Ask Price:    ' +eur_usd.get_bid() +' /   '+eur_usd.get_ask())
    return render(request, 'personal/basic.html', {'eur': eur})

def VaR (request):
    hallo = "this is a python sting"
    return render(request, 'personal/basic.html', {'lol': hallo})

array initialization中定义的C中实际支持这一点:

  

如果已知阵列的大小,则可能比阵列的大小小1   字符串文字,在这种情况下,终止空字符是   忽略:{% extends "personal/header.html" %} {% block content %} <p>{{eur}}</p> <p>{{lol}}</p> {% endblock %}

对于C ++,我看不到直接的方式;但有人可以解释如下:

const char digits[16] = "0123456789abcdef";

答案 1 :(得分:2)

我不知道你为什么要做这样的事情,但是如果你能应付使用编译器扩展,Clang和GCC会让你编写一个模板化的用户定义文字运算符,它将切掉尾随的空值:

template <typename CharT, std::size_t N>
struct string_literal {
    static constexpr std::size_t size = N;
    const CharT str[N];
};

template <typename CharT, CharT... Str>
constexpr string_literal<CharT, sizeof...(Str)> operator"" _lit()
{
    return {{ Str... }};
}

int main()
{
    constexpr auto s = "test"_lit;
    static_assert(s.size == 4);
    static_assert(s.str[0] == 't'); // etc
}

(返回std::array<const char, N>是另一种选择。)

我不知道这是否是你所追求的,但我真的不明白诚实的动机 - 即使在70年代,C的设计师并不太担心“浪费”字符串文字中的单个字节。

答案 2 :(得分:0)

这可能有点过分,但如果使用std::array是可以接受的,那么您可以使用constexpr函数从字符串文字中静态构建一个:

#include <array>
#include <iostream>

// A type-level list of indices.

template <size_t... Xs>
struct indices { using type = indices<Xs..., sizeof...(Xs)>; };

// Generate indices from 0 to N.

template <std::size_t N>
struct upto { using type = typename upto<N - 1>::type::type; };

template <>
struct upto<0> { using type = indices<>; };

// Make an array by assigning each character
// from the corresponding index in the source.

template <std::size_t... X, typename A = std::array<char, sizeof...(X)>>
constexpr A make_array(char const *const source, const indices<X...>&) {
    return A{{source[X]...}};
}

// A convenience function that deduces the size.

template <std::size_t N>
constexpr std::array<char, N - 1> string_constant(char const (&data)[N]) {
    return make_array(&data[0], typename upto<N - 1>::type{});
}

int main() {
    constexpr auto s = string_constant("123456");
    std::cout << sizeof(s) << '\n';
}

现在sizeof(s)6,如果查看生成的程序集,字符串文字将存储为.ascii,而不是.asciz,因此没有尾随空值字符。您可以使用std::array的成员函数,例如size()begin()end(),并可以将&s[0]投射到const char *以访问角色数据直接。