2015-02-06 5 views
0

Я пытаюсь подсчитать количество пропущенных строк «//» в файле, а не общее количество комментариев. Я попытался использовать функцию strstr(), чтобы проверить, находится ли строка «//» в строковой строке, но она подсчитывает каждую строку?Как подсчитать количество пропущенных строк «//» в C?

case(3) : 

    while (fgets(line, 300, q)){ 

    if (strstr(line, "//") == NULL) CommentedRows++; 

    } 

Я также попытался с strchr(), чтобы искать первое вхождение «/», а затем проверить, если следующий символ «/», но результат всегда 0?

+1

Возможно, вы имели в виду 'if (strstr (line," // ")) CommentedRows ++;' ?? – Gopi

+2

FYI - Ваш код также будет соответствовать 'printf (" // ");' Не уверен, что это проблема для вас. – user590028

+0

'if (strstr (строка," // ")! = NULL)' то, что я думаю должен быть кодом – cmidi

ответ

2

От strstr()'s documentation:

Эти функции возвращают указатель на начало подстроки, или NULL, если подстрока не найдена.

Так что вы должны сделать

if (strstr(line, "//") != NULL) 
{ 
    CommentedRows++; 
} 

или даже короче

if (strstr(line, "//")) 
{ 
    CommentedRows++; 
} 

Однако это как раз говорит о том, что line содержит C- "строку" "//" где-то, кастрированный баран это должно быть истолковано так как комментарий C++/C99 - это еще одна история.

+0

Сэр, я думаю, должно быть проверено, что эти 2 должны быть первыми 2 char's – Gopi

+1

@Gopi: '//' может начинать комментарий, даже если они не являются первыми символами, например, как в этой строке ..... ' std :: cout << std :: endl; // выводим пустую строку ' –

+0

if (strstr (строка," // ")) { Комментирует Rows ++; } Результаты 0 evry time –

3

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

Предполагая, что вы хотите, чтобы сосчитать линии, которые «полностью комментировали», то есть, они начинают с комментарием, возможно, имея дополнительные пробельные символы перед ним, то это может быть решением:

bool IsFullyCommentedLine(char* line) 
{ 
    // For each character in the line 
    for (int i = 0; line[i] != 0; i++) 
    { 
     char c = line[i]; 

     // If it is a/followed by another /, we consider 
     // the line to be fully commented 
     if (c == '/' && line[i + 1] == '/') 
     { 
      return true; 
     } 

     // If we find anything other than whitespace, 
     // we consider the line to not be fully commented 
     else if (c != ' ' && c != '\t') 
     { 
      break; 
     } 

     // As long as we get here we have whitespaces at the 
     // beginning of the line, so we keep looking... 
    } 

    return false; 
} 

int CountFullyCommentedLines(FILE* file) 
{ 
    char buffer[1024]; 

    int commentCount = 0; 
    while (char* line = fgets(buffer, 1024, file)) 
    { 
     if (IsFullyCommentedLine(line)) 
      commentCount++; 
    } 

    return commentCount; 
} 

int main(int argc, char* argv[]) 
{ 
    if (argc == 2) 
    { 
     FILE* file = fopen(argv[1], "r"); 
     printf("Number of fully commented lines, ie the ones that start with optional whitespace/tabs and //:\r\n"); 
     printf("%i\r\n", CountFullyCommentedLines(file)); 
     fclose(file); 
    } 
    return 0; 
} 

Опять же, это предполагает, что вы не хотите считать комментарии, которые начинаются в середине строки, только те, которые комментируют всю строку.

+1

Хорошим примером этого является программа, которую пытается пытаться OP. – djechlin

+0

Мне все равно, если «//» - это что-то другое, кроме комментария –

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