2016-02-01 7 views
0

Всякий раз, когда я запускаю следующий код, я получаю сообщение об ошибкеC: Формат определяет тип «символ *»

«Формат определяет тип char * но аргумент имеет тип int

Программа должна печатать n на n квадрат или треугольник определенного символа. Я довольно новичок в C, и у меня не было большой удачи в устранении этой проблемы.

#include <stdio.h> 
#include <ctype.h> 

void print_square(int n, char c) { 
    for (int i=0; i < n; i++) { 
     for (int j; j < n; j++) { 
      printf("%c", c); 
    } 
     printf("\n"); 
} 
} 

void print_triangle(int n, char c) { 
    int count = 1; 
    for (int i=0; i < n; i++) { 
     for (int j; j < count; j++) { 
      printf("%c", c); 
    } 
     count = count + 1; 
     printf("\n"); 
    } 
} 

int main(int argc, const char * argv[]) { 

int n; 
char cmd; 
char * c; 

do { 

    printf("Enter T for a triangle, S for a square, " 
      "Q to quit: "); 
    scanf("%c", &cmd); 
    cmd = toupper(cmd); 

    if (cmd == 'S' || cmd == 'T') { 
     printf("Enter the size: "); 
     scanf("%d", &n); 
     printf("Enter the character: "); 
     scanf("%c", *c); // error here 

     if (cmd == 'S') { 
      print_square(n, *c); 
     } 

     else { 
      print_triangle(n, *c); 
     } 
    } 

} while (cmd != 'T' && cmd != 'S' && cmd != 'Q'); 

return 0; 
} 
+0

Я считаю, что существует разница между символами 'char *' и 'char' – mylogon

+0

, и компилятор также выводит некоторые другие предупреждения: 1) неиспользуемый параметр' argv [] 'и неиспользуемый параметр' argc'. Предложите сигнатуру смены main() на 'int main (void)' 2) эту строку: 'scanf ("% c ", * c);', параметрами будет много указатель адреса, а не содержимое. предположим: 'scanf ("% c ", &c);' также неверно: 'char c;' не 'char * c;' – user3629249

+0

, применяя мой предыдущий комментарий, также означает, что вызовы : 'print_square()' и 'print_triangle()' должен иметь второй параметр 'c', а не' * c'. – user3629249

ответ

4

Как вы указали уже, ошибка действительно в

scanf("%c", *c); 

Вам необходимо пройти действительный указатель на char, почему разыменовать?

Примечание: В вашем случае вы разыскиваете условный указатель, который вызывает в любом случае undefined behavior.

Для лучшего подхода (вы действительно не нужно c быть указателем есть) сделать что-то вроде

char c; 
    scanf(" %c", &c); //the leading space consumes the newline in input bufer 

и вы должны быть хорошо идти.

Соответственно, вам необходимо передать c вместо *c, как требуется при других вызовах функций.

+1

@TyCharm обратите внимание на пространство перед спецификатором формата '% c'. Это потребляет новую строку и другие пробелы оставлены в буфере ввода с предыдущих входов. –

+0

@WeatherVane whoo !! Я, хотя я пропустил это. Добавил комментарий, чтобы выделить то же самое. :) –

+0

ну почти. Призывы к вспомогательным функциям 'print _ *()' должны иметь второй параметр 'c' не' * 'c', а объявление:' char * c; 'необходимо изменить на' char c'. – user3629249