Как Вы определяете длину неподписанного символа*?

В вашем коде есть некоторые исправления. Это может помочь вам. http://flask.pocoo.org/docs/1.0/quickstart/#static-files

изменения в файле app.py

from flask import Flask, render_template, send_from_directory
import json
import plotly
import plotly.graph_objs as go
import numpy as np

app = Flask(__name__, static_url_path='/static')
app.debug = True


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/analysis')
def analyse():
    count = 500
    xScale = np.linspace(0, 100, count)
    yScale = np.random.randn(count)

    # Create a trace
    trace = go.Scatter(
        x=xScale,
        y=yScale
    )

    data = [trace]
    graphJSON = json.dumps(data, cls=plotly.utils.PlotlyJSONEncoder)
    return render_template('analysis.html',
                           graphJSON=graphJSON)

@app.route('/js/')
def send_js(path):
    return send_from_directory('static/js', path)


@app.route('/css/')
def send_css(path):
    return send_from_directory('static/css', path)


if __name__ == "__main__":
    app.run()

и некоторые исправления в вашем файле index.html



    
    




Примечание: Я изменил маршрут CSS на https://colorlib.com , вы можете использовать его локально, чтобы скачать css. файлы css и main.css и добавили их в папку / css .

21
задан Doug T. 8 May 2009 в 12:26
поделиться

6 ответов

В идеальном мире это не так. Вы используете char * для строк в стиле C (которые заканчиваются NUL, и вы можете измерить длину), а unsigned char * только для байтовых данных (длина которых указывается в другом параметре или в любом другом месте, и в которые вы, вероятно, попадете контейнер STL как можно скорее, такой как vector или basic_string ).

Основная проблема заключается в том, что вы не можете делать переносимые предположения о том, представления хранения символов char и unsigned char совпадают. Обычно они есть, но им позволено не быть. Таким образом, нет строковых библиотечных функций, которые работают с unsigned char *, только с char *, и в общем случае небезопасно приводить unsigned char * к знаку char * и обрабатывать результат как строку. Поскольку символ может быть подписан, это означает, что не нужно приводить unsigned char * к char *.

Однако, 0 всегда является одинаковым представлением значения в unsigned char и char. Так что в неидеальном мире, если у вас есть строка в стиле C откуда-то, но она пришла как беззнаковый char *, то вы (a) приводите ее к char * и продолжаете с ней, но также и (b) ) Узнайте, кто сделал это с вами, и попросите их прекратить.

8
ответ дан 29 November 2019 в 20:25
поделиться

Если вы используете C ++ и в нем есть строка без знака *, лучше сначала поместить его в std :: string, а затем манипулировать им. Таким образом, вы можете делать с ним все что угодно и при этом иметь возможность получать его длину () и / или емкость () в любое время.

Я предполагаю, что вы делаете что-то с указанным массивом для сделать его размер непостоянным. Если вы просто размещаете, устанавливаете и забываете, вы всегда можете сохранить фактический размер размещения массива в отдельной переменной - или, лучше, создать структуру / класс. изобретение std :: string.

0
ответ дан 29 November 2019 в 20:25
поделиться

For the actual size of the pointer:

size_t s = sizeof(unsigned char*);

If you want the length of the string:

unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
30
ответ дан 29 November 2019 в 20:25
поделиться

There could be two meanings to this. Are you just wanting to know how big the pointer type is? If so then Joce's answer is correct

size_t size = sizeof(unsigned char*);

If you're wanting to know how many elements does the pointer point to, that's a bit more complex. If this is a C style string then strlen or some variant is your best option.

However if this is just a pointer to unsigned char which has no relation to a C style string, then there is no way to reliably achieve what you're looking for. C / C++ does not associate a length field with a pointer. You'll need to pass the length around with the pointer or use a class like vector which stores both the pointer and the length.

9
ответ дан 29 November 2019 в 20:25
поделиться

Вы хотите, чтобы длина указателя была int. Если вам нужна длина строки, на которую указывает, используйте strlen: например Размер указателя: sizeof (unsigned char *) Размер строки: strlen (unsigned char *) Многобайтовые символы будут отображаться как ... многобайтовые

0
ответ дан 29 November 2019 в 20:25
поделиться

By unsigned char * I suppose you mean the string located at that pointer. In that case it would be:

strlen(your_string_pointer)

However, this will only find the \0 position. There is no garantee this is the actual allocated memory block size.

-3
ответ дан 29 November 2019 в 20:25
поделиться