Как видно из изображения, я вставил много текста, но общая длина по 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;
}`
fflush(stdin)
— это неопределенное поведение.
sizeof(strlen(s))
то же самое, что и sizeof(size_t)
— на самом деле он не вызывает strlen, а просто возвращает размер возвращаемого типа.
На самом деле вы не используете неправильный int k = sizeof(strlen(s));
. Я предлагаю int len = strlen(s);
переместить его и использовать вместо повторного вызова strlen(s)
.
В сторону: чаще пишут *(s+i)
как s[i]
.
Какова цель realloc
? Это не изменится strlen(s)
Какой цели служит k
в вашем коде?
Какой цели служит math.h
?
Длина строки int k=strlen(s);
: sizeof
только для типов.
Да, я достаточно глуп, чтобы оказаться там, и я был сбит с толку часами. На самом деле это вопрос ранга хакера, поэтому Extention и realloc уже были там; почему там был realloc, я тоже не понял. Спасибо большое, так оно и было на самом деле.
sizeof(strlen(s)+1)
дает вам размер типа size_t
(тип возвращаемого значения функции strlen
), а не длину строкиi
должен иметь тип size_t
realloc
неправильно. Если это не удастся, это приведет к утечке памяти. Этот realloc
все равно не нужен. Но вам нужно сохранить результат во временной переменной, чтобы не потерять ссылку на выделенную память.char *tmp = realloc(s, strlen(s) + 1);
if (tmp) s = tmp
else { /* handle error */}
Большое большое спасибо. Это действительно полезно, но не могли бы вы объяснить мне о size_t в этом
@GhimireSuraj Смотрите Что такое size_t в C?
size_t
— правильный тип для хранения размеров. вместо этого int i;
=> size_t i;
Во-первых, оператор 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;
}
int k=sizeof(strlen(s))
----> Что вы пытаетесь сделать этим утверждением?