2016-08-06 1 views
0
#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); 

} 

В этом коде две строки - это массив, а другой - динамически созданный с использованием указателя.Что будет с размером строки в этом коде?

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

1) Да. Пространство будет потрачено впустую. Ответ: уменьшите выделение. Что касается названия вопроса: ничего. –

+0

2). Краш. 3) вопрос неверен. Размер второй строки не равен 10. Это размер указателя - обычно 4 или 8. –

+0

@WeatherVane спасибо за ввод :) – ekaf

ответ

1
  1. Да, это будет потрачено впустую. Вы можете использовать массивы переменной длины для использования другого предела или использовать динамическое распределение. Независимо от того, стоит ли беспокоиться о потерянном пространстве, отдельный вопрос: если ваша программа считывает строки, которые пользователь вводит вручную (в отличие от чтения файла), вы можете тратить много места, прежде чем оно начнет действовать, если вы не находитесь на встроенная система с серьезными ограничениями памяти.
  2. Вы получите неопределенное поведение, поэтому ваша программа будет недействительной. Не делайте этого - именно поэтому fgets занимает максимальную длину строки.
  3. Позвоните по номеру strlen, чтобы вычислить длину строки. Добавить 1 для нулевого терминатора. Помните, что '\n' является частью строки, когда вы используете fgets, а вход имеет '\n'.
  4. Вы можете использовать расширение POSIX до scanf и передать %ms формат и указатель на char*. Это будет выделять строку с точной длиной, но ваша программа будет менее переносимой. Очевидно, что вам необходимо освободить эти строки, чтобы избежать утечек памяти.
+0

спасибо за вход. Так что я не должен беспокоиться о пространстве, что очень правильно? я получаю параноидальное обращение от моих друзей, если они вещают, что я теряю память в своем коде. И спасибо, что все ваше предложение сработало. Кроме 4-го я попробую последний – ekaf

+0

Утверждение о 'fgets()' в (2) неверно. ['fgets()' будет читать "не более' size - 1' characters "] (http://linux.die.net/man/3/fgets) –

+0

@ HonzaRemeš Право, я смутил его% 50s в scanf. Благодаря! – dasblinkenlight