2013-02-18 3 views
0

Я новичок в C, и я пытаюсь итеративно вызывать линию в потоке и проверять, содержит ли она мою строку поиска или если она равна нулю. Я не могу понять, как сделать эту проверку, я получаю предупреждение о том, что [Предупреждение] сравнение между указателем и целым числом или назначение [Предупреждение] делает указатель из целого без трансляции всякий раз, когда я пытаюсь это сделать. может ли кто-нибудь помочь? Благодарю.C программирование, вызов функции

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 

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

    FILE *fpntr; 
    char *file_pathname, *first_line; 

     if (argc != 2) { 
     fprintf(stderr, "usage: %s FILE\n", argv[0]); 
     return EXIT_FAILURE; 
     } 
    file_pathname = argv[1]; 

    if ((fpntr = fopen(file_pathname, "r")) == NULL) { 
     fprintf(stderr, "Error opening file %s: %s\n", file_pathname, strerror(errno)); 
    return EXIT_FAILURE; 
    } else { 
     grep_stream(); 
     fclose(fpntr); 
    } 
    return EXIT_SUCCESS; 
    } 

int grep_stream(FILE *fpntr, char *string, char *file_pathname) { 
      //warning is on next line 
    while ((? = get_next_line(fpntr)) == NULL) { 
     perror("Error reading line"); 
     exit(EXIT_FAILURE); 
} 
elseif() 
{ 
    printf("First line in : %s \n %s", file_pathname, string); 
} 

} 

    char *get_next_line(FILE *fpntr) { 
    char *buff = malloc(101); 
    int pos = 0; 
    int next; 

    while ((next = fgetc(fpntr)) != '\n' && next != EOF) { 

    buff[pos++] = next; 

    } 
    buff[pos] = '\0'; 
    if (buff != NULL) { 
    return buff; 
    } else 
     return NULL ; 

      } 
+2

первый вверх, пожалуйста исправить форматирование –

+3

Просьба (или работать с вами.): Образец кода, компилирует и запускает (или должен), и номера строк, в которых вы получаете ошибки/предупреждения. – congusbongus

+0

Во-вторых, укажите сообщение EXACT и определите строку EXACT, которая помечена. –

ответ

0

добавить * к указателю целого числа, чтобы преобразовать его из указателя на целое

+0

Какой указатель? Я не вижу указателя на целое число в коде OP. – LihO

0

... я пытаюсь итеративно называть строку в потоке ...

Почему не использовать fgets()?

Во-вторых, в соответствии подстроку в строке, вы можете использовать strstr()

Пожалуйста, используйте стандартную библиотеку C вместо Переизобретая колесо. Обычно это экономит день.

1

Помните, что код C скомпилирован сверху вниз. Функция get_next_line не объявляется к моменту считывания строки while.

Либо двигаться 'определение s, чтобы перед main' get_next_line с, или вперед объявить его, говоря:

char *get_next_line(FILE *fpntr); 

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

Кроме того, правильно форматировать код как ради вас и тех, кто будет отвечать на ваши вопросы

0
#include <assert.h> // I'm too dumb to program without assertions! 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 
//#include <unistd.h> I prefer stdlib.h, couldn't see any need for non-portable header... 

#define MAX_LINE (101)  // define funky constants in one place for easy changing later. 

// declare functions before using them 
void grep_stream(FILE *fpntr, char *file_pathname); 
char *get_next_line(FILE *fpntr); 


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

    FILE *fpntr; 
    char *file_pathname; 

    if (argc != 2) { 
     fprintf(stderr, "usage: %s FILE\n", argv[0]); 
     return EXIT_FAILURE; 
     } 
    file_pathname = argv[1]; 

    if ((fpntr = fopen(file_pathname, "r")) == NULL) { 
     fprintf(stderr, "Error opening file %s: %s\n", file_pathname, strerror(errno)); 
     return EXIT_FAILURE; 
     } 
    else { 
     grep_stream(fpntr, file_pathname); 
     fclose(fpntr); 
     } 
    return EXIT_SUCCESS; 
    } 

void grep_stream(FILE *fpntr, char *file_pathname) { 
    char* line; 
    int  got_first = 0; 

    assert(fpntr); 
    assert(file_pathname); // I worry the guy who wrote main() might be an idiot like me! 

    //warning is on next line [not anymore!] 
    while ((line = get_next_line(fpntr)) != NULL) { 
     if(!got_first) { 
      printf("First line in : %s \n%s\n", file_pathname, line); 
      got_first = 1; 
      } 
     // if we're not going to use it, let's not leak memory 
     free(line); 
     } 
    } 


char *get_next_line(FILE *fpntr) { 
    char *buff = malloc(MAX_LINE); 
    int pos = 0; 
    int next; 

    assert(buff != NULL); // wouldn't it be nice to know malloc() worked? 
    while ((next = fgetc(fpntr)) != '\n' && next != EOF) { 
     buff[pos++] = (char)next; 
     assert(pos < (MAX_LINE-1)); // don't want to be right back on SO with a seg fault, eh? 
     } 
    buff[pos] = '\0'; 

    if(next == EOF) { 
     free(buff); 
     buff = NULL; 
     } 

    return buff; 
    } 
Смежные вопросы