Неточный размер строки при динамическом выделении памяти

Как видно из изображения, я вставил много текста, но общая длина по strlen показывает только 8 (k = 8).

Я хотел напечатать полный текст, вставленный в одну строку в строке, но он останавливается на 8-м символе.

`#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    
    int i;
    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);
    int k=sizeof(strlen(s));
     for(i=0;i<sizeof(strlen(s)+1);i++)
    {
        if (*(s+i)!=' ')
            printf("%c",*(s+i));
        else
            printf("\n");
      fflush(stdin);
    }
    free(s);
    return 0;
}`
int k=sizeof(strlen(s)) ----> Что вы пытаетесь сделать этим утверждением?
Haris 08.01.2023 12:12
fflush(stdin) — это неопределенное поведение.
Haris 08.01.2023 12:13
sizeof(strlen(s)) то же самое, что и sizeof(size_t) — на самом деле он не вызывает strlen, а просто возвращает размер возвращаемого типа.
Chris Dodd 08.01.2023 12:17

На самом деле вы не используете неправильный int k = sizeof(strlen(s));. Я предлагаю int len = strlen(s); переместить его и использовать вместо повторного вызова strlen(s).

Weather Vane 08.01.2023 12:24

В сторону: чаще пишут *(s+i) как s[i].

Weather Vane 08.01.2023 12:26

Какова цель realloc? Это не изменится strlen(s)

Support Ukraine 08.01.2023 12:32

Какой цели служит k в вашем коде?

Haris 08.01.2023 12:38

Какой цели служит math.h?

Haris 08.01.2023 12:39

Длина строки int k=strlen(s); : sizeof только для типов.

QuentinUK 08.01.2023 12:46

Да, я достаточно глуп, чтобы оказаться там, и я был сбит с толку часами. На самом деле это вопрос ранга хакера, поэтому Extention и realloc уже были там; почему там был realloc, я тоже не понял. Спасибо большое, так оно и было на самом деле.

Ghimire Suraj 08.01.2023 13:07
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
10
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. sizeof(strlen(s)+1) дает вам размер типа size_t (тип возвращаемого значения функции strlen), а не длину строки
  2. i должен иметь тип size_t
  3. fflush во входном потоке не требуется и строго определяется реализацией. Читайте:Это правильный способ очистки входного потока C?
  4. Вы используете realloc неправильно. Если это не удастся, это приведет к утечке памяти. Этот realloc все равно не нужен. Но вам нужно сохранить результат во временной переменной, чтобы не потерять ссылку на выделенную память.
char *tmp = realloc(s, strlen(s) + 1);
if (tmp) s = tmp
else { /* handle error */}

Большое большое спасибо. Это действительно полезно, но не могли бы вы объяснить мне о size_t в этом

Ghimire Suraj 08.01.2023 13:08

@GhimireSuraj Смотрите Что такое size_t в C?

pzaenger 08.01.2023 13:26
size_t — правильный тип для хранения размеров. вместо этого int i; => size_t i;
0___________ 08.01.2023 13:26
Ответ принят как подходящий

Во-первых, оператор sizeof возвращает размер типа в байтах, а не количество элементов в массиве. Чтобы получить количество элементов в s, вы должны вместо этого использовать strlen(s).

Во-вторых, функция scanf прекратит чтение ввода, когда встретит символ новой строки, поэтому, если вы введете строку длиннее 8 символов, будут прочитаны только первые 8 символов. Чтобы прочитать строку, которая может содержать пробелы, вы можете вместо этого использовать fgets:

fgets(s, 1024, stdin);

Наконец, нет необходимости вызывать realloc после вызова scanf или fgets, потому что размер s уже составляет 1024 символа, чего более чем достаточно для хранения входной строки.

С этими изменениями ваш код должен работать как положено. Вот измененная версия:

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

int main() {
    int i;
    char *s;
    s = malloc(1024 * sizeof(char));
    fgets(s, 1024, stdin);
    int k = strlen(s);
    for(i = 0; i < k; i++) {
        if (*(s+i) != ' ') {
            printf("%c", *(s+i));
        } else {
            printf("\n");
        }
    }
    free(s);
    return 0;
}

Другие вопросы по теме