wedtorque Ответов: 2

Что произойдет с размером строки в этом коде?


В этом коде есть две строки: одна является массивом, а другая динамически создается с помощью указателя.

1.Если мой ввод меньше 50 для string1 и меньше 10 для string2 ,будет ли пространство, которое не заполнено, потрачено впустую, если да, то как уменьшить размер.
2.In случай строки 2 параметр размера malloc равен 10, а параметры размера fgets - 10 что произойдет, если я увеличу размер до fgets(string2, 50, stdin), который больше размера malloc?
3. Как рассчитать конечный размер входной строки в каждом конкретном случае?Я использовал оператор sizeof, но он дал жестко закодированный размер, равный 50 и 10 соответственно для string1 и string2
4.Is есть ли другой лучший подход к созданию динамической строки?

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int size=10;
    char string1[50];       
    char *string2;
    string2=(char *)malloc(size*sizeof(char));

    fgets(string1,10,stdin);
    printf("%s",string1);

    fgets(string2,10,stdin);
    printf("%s",string2);

}

2 Ответов

Рейтинг:
2

nv3

1) Да, он будет потрачен впустую - хотя потеря нескольких байтов не является серьезной проблемой на современных компьютерах.

2) Если вы укажете большую длину в вызове fgets, чем доступно в вашем буфере, результат будет неопределенным. Операция перезапишет некоторую память за выделенным буфером, результат которой не определен. В худшем случае это может привести к сбою программы.

3) для определения эффективной длины строки с нулевым окончанием используйте функцию strlen или ее двоюродные братья для широких символов.

4) Да, есть лучший подход, но он требует C++. Там у вас есть готовые классы, такие как std::string или CString, которые выполняют большую часть тяжелой работы по управлению буфером за вас.


Рейтинг:
2

Patrice T

Цитата:
Что произойдет с размером строки в этом коде?
Ничего, то, что вы храните в переменной, не меняет ее размера.
1) Да, это пустая трата места, не большая проблема.
2) C/C++ не отмечены, поэтому вы несете ответственность за заботу об этом.
Это приводит к проблеме под названием переполнение буфера Переполнение буфера-Википедия, свободная энциклопедия[^]
Этой проблемы можно избежать, если использовать управляемые языки.