2013-10-06 3 views
0

Работа над проектом c, и я попал в блокпост. Я пытаюсь напечатать стиль координаты точки, и я включил весь код, необходимый, чтобы помочь вам помочь мне!Проблемы с fgets и printf..printing string

//point.h 
struct Point{ 
    char label; 
    int x; 
    int y; 
}; 

//point.c 
displayPoint(struct Point p){ 
    char label = p.label; 
    int x = p.x; 
    int y = p.y; 

    // label: (x, y) 
    printf("(%c: (%d, %d)", label, x, y); 
} 


//build point from standard input 
readPoint(){ 
    struct Point point; 
    printf("Enter label (character): "); 
    fgets(buff, MAX_LINE, stdin); 
    point.label = buff; //I think this is the issue here 
    printf("Enter x:"); 
    fgets(buff, MAX_LINE, stdin); 
    point.x = (int) strtol(buff, NULL, MAX_LINE); 
    printf("Enter y:"); 
    fgets(buff, MAX_LINE, stdin); 
    point.y = (int) strtol(buff, NULL, MAX_LINE); 

После компиляции, я получаю следующее сообщение об ошибке:

points.c: In function 'displayPoint': 
points.c: warning: initialization makes pointer from integer without a cast [enabled by default] 
points.c: warning: format '%c' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat] 
points.c: In function 'readPoint': 
points.c: warning: assignment makes integer from pointer without a cast [enabled by default] 

Если я создаю точку, используя следующую информацию:

Label: A 
x: 2 
y: 3 

и запустить displayPoint я получаю этот выход:

R: (2, 3) 

Очевидно, что это неправильно, я не знаю, откуда пришел R. Что мне здесь не хватает? Почему C должен быть таким упрямым, это было бы так просто сделать в Java, Python и т.д.

+0

C имеет дополнительную концепцию указателей, которая дает людям головные боли. Но без этого концепция программирования - это какая-то неполная, хотя она одинаково опасна и потребуется время, чтобы учиться.Как уже указывалось, вы пытаетесь присвоить массив char (buff) одному символу, который невозможен. – fayyazkl

+0

Это: 'readPoint() {/ * ... * /}' - устаревшая форма определения функции, и она даже не будет компилироваться с помощью компилятора C99 или более позднего. Всегда декларировать тип возвращаемого значения и все типы параметров явно; если функция не имеет параметров, используйте '(void)'. Таким образом, это должно быть 'void readPoint (void) {/ * ... * /}'. Аналогично для некоторых других ваших функций. (Это не является причиной вашей проблемы.) –

ответ

3

У вас есть несколько проблем здесь:

  1. fgets получает буфер, а не один символ. Я надеюсь, что buff объявлен как массив символов (char buff[MAX_LINE]).

  2. Ваша структура объявляет один символ для своей метки, но вы назначаете свой буфер символу.

  3. Вы повторно используете буфер. Поскольку это всего лишь указатель на кусок памяти, вы потенциально собираете старые данные. Вы можете (читайте, возможно, захотите) сбросить свой буфер между использованиями.

Учитывая это, я думаю, что вы собираетесь это:

point.label = buff[0]; 

Я предполагаю, что вы просто хотите, один символ для этикетки, в этом случае это должно работать, и вы не будете сбрасывать эту ценность. (Я не знаю о остальной части вашего ввода.)

+0

Спасибо, Майкл! –

1
point.label = buff //I think this is the issue here 

Вы видите с запятой на конце этой линии?
Не заканчивается ли заявка C полуколонами?


То же самое здесь:

struct Point{ 
    char label; 
    int x; 
    int y; 
} 

декларации Struct должны заканчиваться точкой с запятой.

+0

Woops, пропустил этот, есть один в моем коде, а не код, который я написал здесь. Мне нравится переписывать свой код, когда я задаю вопросы, иногда помогает мне найти свои ошибки! Спасибо –

+1

@NesBa: переписывание кода перед публикацией здесь прекрасное, но сделайте это в своей собственной системе и скопируйте и вставьте * точный * код, который вы подали в компилятор. Мы не можем сказать разницу между ошибками, которые на самом деле находятся в вашем коде и опечатками, которые вы делали во время публикации. Не заставляй нас гадать. –

2

Вы не можете выполнить такую ​​asignment:

point.label = buff; 

любителем является массивом и метка является символом. Вы можете использовать memcopy, но если вам нужна метка в вашей структуре, разместите там массив, чтобы вы могли его сохранить. В персонаже вы можете сохранить только 1 символ.

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