0

この警告/エラーを修正する方法を教えてください。「-」かどうかを判断するために、文字列の最初の文字だけを取得しようとしています。

エラー:

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++;
    }
4

1 に答える 1

1

あなたのコードで見つけた問題を列挙します

  1. の正しい使用法はstrcmp()、この行のコードに存在します

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

    strcmp()これは、文字比較ではなく、文字列比較を目的としています。

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

    する必要があります

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

    コンパイルを強制するために変数をキャストしないでください。代わりに、コンパイラ エラー/警告の実際の原因を見つけてください。

  2. 重大なエラーが発生しました。thisLine charポインターにスペースを割り当てていません。メモリを割り当てるか、次のような配列malloc()として宣言する必要がありますchar

    char thisLine[SOME_CONSTANT_NUMBER];
    

    また、これ

    while(feof(stdin) == 0)
    

    代わりにこのようにすることは決して良い考えではありません

    char thisLine[100];
    while (fgets(thisLine, sizeof(thisLine), stdin) != NULL)
    
  3. 別の非常によくある間違いを犯しました。c の配列は から0までインデックス付けされてN - 1いるため、

    char *pattern = argv[argc]
    

    最後の要素の後に 1 つの要素を読み取っているため、正しいコードは次のとおりです。

    char *pattern = argv[argc - 1]
    

    これにより、最後の要素が得られます。

于 2015-02-27T00:10:57.437 に答える