2013-11-20 2 views
0

Я пишу код, который читается в списке символов (с использованием перенаправления), но строка, в которой хранятся символы, имеет размер 41. Количество символов не приближается к размеру массива , поэтому мне нужно использовать malloc(), чтобы получить точный размер массива. Когда я печатаю массив без использования функции malloc, он печатает символы и другую тарабарщину вместе со строкой. Мне нужно malloc строку, чтобы символы и тарабарщина не были включены.Как использовать функцию malloc() для символа string/array?

Код:

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

int main() { 

    char c; 
    char r1[41]; 
    int a = 0; 

    while(scanf("%c", &c) != EOF) { 
     if(c >= 'A' && c <= 'Z' || c == '[' || c == '.' || c == '!') { 
     r1[a] = c; 
     a++; 
     } 
    } 

    printf("\nThe string is: %s\n", r1); 

return 0; 
} 

Выход:

The string is TR[!.DFQ▒ ▒ ▒ 這 
+2

'NUL' terminator ... –

+2

Ваша' строка' представляет собой массив из 42 указателей на 'char'. Вы хотите 'char string [40 + 1];'. (И, конечно, вам нужно сохранить в нем некоторое значение.) –

+0

В этом коде нет ничего, что бы считывать любые значения из любого места. Таким образом, содержимое вашего массива 'string' не инициализируется, что приводит к дальнейшему неопределенному поведению ... – twalberg

ответ

2

Есть несколько точек путаницы смешиваются здесь.

  1. Причина, по которой ваш код печатает тарабарщину, не обусловлен фиксированной длиной и переменной длиной. Переключение на malloc() не устранит эту проблему. Убедитесь, что у вас есть нулевой терминатор ('\0') в конце строки:

    while(scanf("%c", &c) != EOF) { 
        ... 
    } 
    
    r1[a] = '\0'; 
    
  2. Ваш оригинальный код смешанный массив и указатель синтаксиса. Для одной строки вы должны использовать либо char[], либо char*, но не оба.

    Для строки фиксированного размера, объявить его как:

    char string[40+1]; 
    

    Для строки переменной длины, сделайте:

    char *string = malloc(length + 1); 
    
    if (string == NULL) { 
        fprintf(stderr, "malloc failed\n"); 
        exit(EXIT_FAILURE); 
    } 
    
    // memory allocation successful 
    
+0

Сначала я использовал объявление: char string [40 + 1]. Я думаю, будет лучше, если я покажу весь код. –

+0

Я отлаживал программу много раз, когда я использовал точный размер массива, символы и тарабарщина не печатались. Таким образом, дополнительные индексы вызывают символы и тарабарщину. –

+0

@TomMurphy Нет, это не так. Это неопределенное поведение, вызванное отсутствием NUL-терминатора. Будьте скромными, не пытайтесь быть умнее, чем тот, кто указал и решил вашу очевидную ошибку начинающего. –

1
char *string[40+1]; 

Это определяет string как массив из 41 указателя до char. Если вы хотите, чтобы держать строку, вы хотите, чтобы определить его как:

char string[40+1]; 

Если вы знаете (во время выполнения, но не во время компиляции), как долго строка будет, вы можете использовать malloc - но вы хотите, чтобы присвоить результат одного указателя типа char*:

char *s = malloc(len + 1); 
if (s == NULL) { 
    /* malloc failed, handle the error */ 
} 

Это заставляет s указывать на первый (0-й) элемент массива char. Этот массив не инициализирован, поэтому вам нужно скопировать некоторые данные в него.

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

printf("The string is: \"%s\"\n", string); 

comp.lang.c FAQ является отличным ресурсом для такого рода вещи ,

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