2016-04-20 3 views
0

У меня проблема с функцией set_ccs. Я не могу принимать элементы от пользователя. Как я могу это исправить?Двойной указатель и символ

int main(){ 

    char *ccs; 

    *ccs =(char*)malloc(sizeof(char) * 80);//i have to use dynamic memory allocation  
    printf("Enter CCS: "); 
    set_ccs(&ccs); 
    free(ccs); 
    return 0; 
} 

int set_ccs(char **ccs){ 

    int i = 0; 

    scanf("%s",*ccs);//Is it better to use fgets? Because scanf seems to count 'enter' 

    while(*ccs!='\0'){ 
     ccs++; 
     i++; 
    } 

    printf("Length of sequence : %d\n",i);//It always return 3 
    printf("%s",ccs); //with weird elements 
return i; 
} 

Спасибо.

+2

Это в ваших интересах, чтобы не бросить возвращаемое значение 'malloc' немедленно так. – Shark

+0

Отправить один указатель, а не двойной указатель, когда 'malloc' находится в вызывающей функции. – i486

+0

Просьба дать минимальный, компилируемый пример. Мы не можем помочь без достаточной информации. – Boiethios

ответ

0

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

char *ccs; 
ccs = malloc(80); 

Вы должны сделать функцию set_ccs() принять указатель:

int set_ccs(char *ccs) 

И называют это как это от вашей основной:

set_ccs(css); 

Тогда в вашей функции вы можете использовать scanf() как так:

scanf("%s", css); 

Теперь вы, если вы хотите, чтобы проверить '\0', это хорошая практика для инициализации «строка» в 0, прежде чем использовать его. Вы можете сделать это с помощью calloc(80) вместо malloc(80).

Если вам необходимо иметь указатель на указатель (char **ccs), вы должны сделать двойной указатель на вашем главном, проверить этот код:

int main(){ 

    char *ccs; 
    char **ccs2; //a pointer to a pointer 

    ccs = calloc(80); //i have to use dynamic memory allocation 
    ccs2 = &ccs; //pass the address of the pointer to the double pointer 

    printf("Enter CCS: "); 
    set_ccs(ccs2); //pass the double pointer 
    free(ccs); 
    return 0; 
} 

int set_ccs(char **ccs){ 

    int i = 0; 

    scanf("%s", *ccs); 
    char *c = *ccs; //copy to make increments 

    while(*c != '\0'){ 
     c++; 
     i++; 
    } 

    printf("Length of sequence : %d\n", i); 
    printf("%s", *ccs); 
    return i; 
} 
+0

int set_ccs (char ** ccs) - это требование для моего проекта. Это неправильно или это вариант, используя это? – dgknrsln

+0

@dgknrsln см. Обновленный ответ – moffeltje

+0

У меня еще 2 проблемы сейчас. Во-первых, я получаю ошибку, когда я использую 'ccs = calloc (80)', но это нормально с 'ccs = (char *) malloc (sizeof (char) * 80)'. Он работает сейчас, но вы думаете, что что-то не так? Во-вторых, когда я вводим последовательность символов с пробелом, например. ** программное кодирование **, код всегда принимает роль перед пространством. Что я должен сделать для принятия всей последовательности? fgets? – dgknrsln

0

Это:

char *ccs; 

*ccs =(char*)malloc(sizeof(char) * 80); 

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

Это должно быть просто:

ccs = malloc(80); 

Там нет необходимости масштабировать по sizeof (char), что всегда 1.

Кроме того, please don't cast the return value of malloc() in C.

+0

И 'int set_ccs (char ** ccs) {' должен быть 'int set_ccs (char * ccs) {' и 'scanf ("% s ", * ccs);' должен быть 'scanf ("% s " ccs); '... много проблем –

+0

@AlterMann int set_ccs (char ** ccs) - это требование для моего проекта. Это неправильно или это вариант, используя это? Также есть недопустимое преобразование [Error] из 'void *' в 'char *' [-fpermissive], когда я пишу, как ccs = malloc (80), но это нормально с ccs = (char *) malloc (sizeof (char) * 80); – dgknrsln

+0

Да, это неправильно, потому что вы сравниваете 'char' с указателем на' char' в цикле 'while', то же самое для вашего' printf', вы печатаете указатель на указатель на 'char', указав указатель на 'char' ('% s'). –

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