LINUX.ORG.RU

[тупняк]gcc ругается на код

 , ,


0

1
#include <stdio.h>
#define TRUE 1
#define FALSE 0

void main ()
{
	char c;

	while(TRUE){
		getchar(c);
		if (c == " " || c == "\t"){
			printf("\n");
		}
		putchar(c);
	}
}

Программа выводит каждый символ с новой строки. gcc же ругается:

main.c: In function ‘main’:
main.c:10:3: error: too many arguments to function ‘getchar’
   getchar(c);
   ^~~~~~~
In file included from main.c:1:0:
/usr/include/stdio.h:540:12: note: declared here
 extern int getchar (void);
            ^~~~~~~
main.c:12:9: warning: comparison between pointer and integer
   if (c == " " || c == "\t"){
         ^~
main.c:12:21: warning: comparison between pointer and integer
   if (c == " " || c == "\t"){
                     ^~

ЧЯДНТ?


> cat 0000.c
#include <stdio.h>

int main (){
        int c;

        for(;;){
                c = getchar();
                if (c == EOF) break;
                if (c == ' ' || c == '\t') putchar('\n');
                else putchar(c);
        }
        return 0;
}
> echo "gcc ругается на код" | ./0000
gcc
ругается
на
код
saahriktu ★★★★★ ()
Ответ на: комментарий от imul

Там его нет. Щас читаю его. Но стиль очень похож, к примеру: выполнение операций в условии.

batya ()
Ответ на: комментарий от awesomelackware

Этот тред напомнил мне какой-то другой, м-м-м, не могу вспомнить.

awesomelackware ()

Первое

#define TRUE 1
#define FALSE 0
Заменить на #include <stdbool.h>

Второе
 extern int getchar (void);
            ^~~~~~~
man getchar
int getchar(void);

Третье не "\t" " " a '\t' ' '

Ты должен сравниваить символы, а не массивы. Для сравнния и поиска символьных массивов есть strcmp() и strstr()

Dron ★★★★★ ()

void main ()

В Си сигнатура главной функции может быть одной из следующих

  • int main(void)
  • int main(int argc, char *argv[])

Все остальное считается «implementation-defined».

getchar(c);

man getchar

c == " " || c == "\t"

Ты сравниваешь «символ» (однобайтовое число) с указателем (man C string). Используй одинарные кавычки.

theNamelessOne ★★★★★ ()

Батя не умеет читать сообщения компилятора. И не знает стандартную библиотеку.

Почему я не удивлён?

a1batross ★★★★★ ()
Ответ на: комментарий от batya

До сих пор бомбит?

вполне спокойно

Ну-ну.

anonymous ()

main.c:10:3: error: too many arguments to function ‘getchar’

Перевод: передано слишком много аргументов в функцию getchar.

Твоё действие: man getchar

main.c:12:9: warning: comparison between pointer and integer

Перевод: сравнение УКАЗАТЕЛЯ с целым числом

Твоё действие: man C-string

Некоторые почему-то считают, что Си нужен для написания подобного буллщита, но суть этого примера - ПОНЯТЬ основы. А чтобы это произошло, нужно перестать копипастить примеры из учебника и начать вкуривать каждую строку кода до полного просветления.

Иначе следует выбрать более подходящий инструмент:

$ printf '%s\n' gcc ругается на код
gcc
ругается
на
код
Nietzsche ()
Ответ на: комментарий от batya

Все остальное считается «implementation-defined».

Даже main() из K&R?

Сомневаюсь, что у K&R где-то присутствует void main(), но если так, то даже из K&R. По стандарту функция main() всегда возвращает int.

И, кстати, хоть K&R и классика, но, увы, безнадёжно устаревшая. Многие конструкции, описанные в книге, современными компиляторами без специальных опций совместимости не поддерживаются. А многого из того, что появилось за 39 лет с момента написания книги, там просто нет.

aureliano15 ★★ ()
Ответ на: комментарий от Dron

Первое сломает сборку штудиями. Я конечно понимаю, что они инвалиды, но во всём мире принято не отстреливать инвалидов, а делать пандусы, специальные службы и другую помощь для них

mittorn ★★★★★ ()
Ответ на: комментарий от batya

Твой? Ну это нормально, многие бомбят, когда начинают учить си. Некоторые даже улетают на своём пукане в php или javascript.

mittorn ★★★★★ ()
Ответ на: комментарий от batya

Зачем ты себе сочувствуешь, просто не бомби.

anonymous ()
Ответ на: комментарий от i-rinat

Ай-яй-яй, как не стыдно.

проблема-то не в main() а в void

reprimand ★★★★★ ()
Ответ на: комментарий от i-rinat

А ви таки хотите:

#include <stdio.h>

int
main(int argc, char **argv, char **envp)
{
        while (*argv)
                printf("argv: %s\n", *argv++);

        while (*envp)
                printf("envp: %s\n", *envp++);

        return 0;
}

beastie ★★★★★ ()
Ответ на: комментарий от beastie

Вообще-то я имел в виду, что int main() эквивалентно int main(...), а не int main(void).

Вариант с argc, argv и envp в этом смысле лучше, но тут код плох тем, что он меняет входные параметры. Формально это делать можно, но от этого код становится менее читаемым. Это какая-то напасть у программистов на Си. Он стараются выпендриться. Присваивания в условии цикла, другие трюки. Это хорошие задачки для тренировки внимательности, но из-за того, что они требуют на себя дополнительное внимание, шансы найти реальные баги в коде сильно падают.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Посыл то я понял. ;) Правда, по поводу main() vs main(void) мнения расходятся.

Своим вторым примером я только хотел показать, что параметры у main могут быть не только пустыми или всем привычная парочка argc/argv, а что есть ещё и мало-известный 3-й параметр envp.

Ref: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/csu/crt0.c?rev=1.10&cont...

beastie ★★★★★ ()
Ответ на: комментарий от beastie

есть ещё и мало-известный 3-й параметр envp.

Ну это потому что компилятор не обязан его поддерживать. В стандарте требуются только два варианта, без параметров и с argc-argv. А в конкретных реализациях бывает разное. Например, функция wmain и глобальная переменная _wenviron.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Компилятор тут не у дел. Вызов main — это дело C-runtime (тот самый crt0.s) с которым оно линкуется.

beastie ★★★★★ ()
Ответ на: комментарий от beastie

мало-известный 3-й параметр envp.

На Darwin-based есть еще и четвёртый ;)

KennyMinigun ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.