2015-02-27 2 views
0

Может кто-нибудь сказать мне, как исправить это предупреждение/ошибку. Я пытаюсь получить только первый символ строки, чтобы определить, является ли это «-».Базовый указатель предупреждения о цикле от int

Ошибка:

grep-lite.c:15:13: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
    if(strcmp((char *) pattern[0],"-") == 0) 
      ^
grep-lite.c:29:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
    while(strcmp((char *) argv[index][0],"-")) 
       ^

Источник с предупреждений/ошибок:

Линия 15:

if (strcmp((char *) pattern[0],"-") == 0) 

Линия 29:

while (strcmp((char *) argv[index][0],"-")) 

Полная Источник:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "grep-lite.h" 

int main(int argc, char * * argv) 
{ 
    //initailize variables 
    int index = 1, lineNumber = 1; 
    int oneMatchingLine = FALSE; 
    int invertOpt = FALSE, lineNumOpt = FALSE, quietOpt = FALSE; 
    char * pattern = argv[argc]; 

    //check if last arguement is invalid by starting with a '-' 
    if(strcmp((char *) pattern[0],"-") == 0) 
    { 
     error(INVALID_PATTERN); 
     return EXIT_ERROR; 
    } 

    //check if they asked for help 
    if(strcmp(argv[index],"--help") == 0) 
    { 
     printHelpStatement(); 
     return EXIT_SUCCESS; 
    } 

    //walk through all options 
    while(strcmp((char *) argv[index][0],"-")) 
    { 
     //find and set option 
     if(processOptions(argv[index], &invertOpt, &lineNumOpt, &quietOpt)) 
    index++; 
     //if invalid option fai 
     else 
    { 
     error(INVALID_OPTION); 
     return EXIT_ERROR; 
    } 
    } 

    //walk through stdinput searching for pattern relationship 
    while(feof(stdin) == 0) 
    { 
     //initialize 
     char * thisLine = NULL; 

     // get read line with fgets 
     thisLine = fgets(thisLine, MAX_CHARACTERS, stdin); 

     //find pattern location in thisLine 
     char * patternLoc = strstr(thisLine, pattern); 

     //check if we should print this line based of patternLoc and invertOpt 
     if((!patternLoc != NULL && !invertOpt) || (pattenLoc == NULL && invertOpt)) 
    { 
     //see if we should print this line 
     if(!quietOpt) 
     printLine(thisLine, lineNumOpt, lineNumber); 
    } 
     lineNumber++; 
    } 
+0

Обратите внимание, что 'argv [argc]' обращается к 'argv' вне границ (последний элемент находится в' argc-1'). – SleuthEye

+0

'if (pattern [0] == '-') {/ * ... * /}' –

ответ

1

Я буду перечислять проблемы, которые я нахожу в вашем коде

  1. Правильное использование strcmp() существует в коде, в этой строке

    if (strcmp(argv[index],"--help") == 0) 
    

    strcmp() предназначен для сравнения строк, а не сравнения символов, это

    if(strcmp((char *) pattern[0],"-") == 0) 
    

    должен быть

    if (pattern[0] == '-') 
    

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

  2. У вас есть серьезные ошибки, вы не выделить место для thisLinechar указателя, вы должны выделить память с помощью malloc() или просто объявить его как массив char как

    char thisLine[SOME_CONSTANT_NUMBER]; 
    

    Кроме того, это

    while(feof(stdin) == 0) 
    

    никогда не является хорошей idea вместо это сделать, как этот

    char thisLine[100]; 
    while (fgets(thisLine, sizeof(thisLine), stdin) != NULL) 
    
  3. Вы сделали еще одну очень распространенную ошибку, массивы с индексируются 0 к N - 1, так

    char *pattern = argv[argc] 
    

    это неправильно, потому что вы читаете один элемент после последнего, правильный код

    char *pattern = argv[argc - 1] 
    

    , который даст вам последний элемент.

+0

Спасибо!Тестирование сейчас – napkinsterror

+0

@napkinsterror Я ожидаю, что ваша программа потерпит крах или что-то подобное, если вы не прочитаете обновленный ответ. –

+0

Я понимаю эти ошибки, был просто сумасшедшим, я не мог исправить основную проблему указателя, но спасибо, что указал на это. – napkinsterror

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