2013-09-17 6 views
-3

Я написал программу для выполнения этих задач: сначала получите строку от пользователя и вычислите ее размер с помощью функции sizeof(). Вот мой код:Ошибка размера массива в C

#include <stdio.h> 
int main() 
{ 
    char U1[]; 
    puts("Enter a string:"); 
    scanf("%s", U1); 
    printf("The %s has %i bytes.", U1, sizeof(U1)); 
    return 0; 
} 

Ошибка компиляции: error: array size missing in ‘U1’ Почему? Пожалуйста, объясните, что здесь не так?

+0

вам необходимо выделить память для массива char. – Bill

+0

Это не дубликат. –

ответ

2

Вам нужно определить размер массива, чтобы сообщить компилятору, сколько места выделить:

char U1[256]; 

Если вы не знаете размер вашего массива во время компиляции, вы можете динамически выделить память с помощью malloc:

// #include <stdlib.h> 
int *arr; 
int n, i; 
printf("Number of elements: "); 
scanf("%d", &n); 

// Allocate n ints 
arr = malloc(n * sizeof(int)); 

printf("Enter %d elements: ", n); 
for(i = 0; i < n; i++) 
    scanf("%d", &arr[i]); 

printf("Here they are: "); 
for(i = 0; i < n; i++) 
    printf("%d ", arr[i]); 

// Free the array on the end! 
free(arr); 

Примечание

printf("The %s has %i bytes.", U1, sizeof(U1)); 

всегда будет печатать 256, так как sizeof возвращает размер массива, вычитаемый во время компиляции, а не количество символов, только что прочитанных в массиве. Вы можете использовать sizeof(char) * (strlen(U1) + 1) для вычисления количества байтов, требуемых строкой (+1 происходит от символа NUL-терминатора в конце строки).

2

C массивы фиксированной длины, поэтому каждый массив должен иметь свой размер, полностью определенный при его объявлении. Действующая декларация что-то вроде:

char U1[256]; 

Обратите внимание, что если пользователь вводит больше указанного числа символов (минус один для завершающего нуля), поведение этой программы не определено. Чтобы избежать этой проблемы, замените scanf("%s") на fgets() и узнайте о dynamic arrays.

+0

Нет, если вы введете строку 257 байт, она будет переполнена. Я прав ? Как я могу это предотвратить? – InJecTable

+0

@InJecTable Даже если вы введете 256-байтовую строку, она переполнит массив, потому что строки C заканчиваются нулевым символом. Чтобы этого избежать, замените один «scanf» на несколько вызовов на «fgets» и используйте динамически выделенный массив, как указано в ответе. – user4815162342

0

Необходимо указать размер вашего массива. Scanf принимает уже выделенный массив и не изменяет его размер, он просто заполняет его вводом.

Ваш код должен выглядеть следующим образом:

#include <stdio.h> 
int main() 
{ 
    char U1[256]; 
    puts("Enter a string:"); 
    scanf("%s", U1); 
    printf("The %s has %i bytes.", U1, strlen(U1)); 
    return 0; 
} 

Обратите внимание, что я не использовал sizeof, потому что я должен был бы весь размер массива, а не только строки. strlen даст вам размер строки с нулевым завершением.

+0

'strlen (U1) + 1' –

+0

Правильно, если вы хотите посчитать последний нулевой байт, вам нужно добавить его. – Jupotter

0

вы должны сделать определенный массив, обычный C-компиляция не поддерживает динамический массив.

0

Массивы в C должны быть объявлены с размером. Другой вариант - использовать динамические массивы, которые являются указателями

Смежные вопросы