2014-12-16 2 views
0

Я хочу получить появление символа ';' для каждой строки этой C-программы. Я набираю имя файла Source.c и пытаюсь подсчитать возникающий символ, но я получаю значение для ВСЕХ из ';' для каждой строки.Присутствует символ в строке

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h>/* For exit() function */ 

int main() 
{ 
    char file_name[150]; 
    FILE *file2 = 0; 

    gets(file_name); 

    { 
     int rows = 1;//broq na vsichki redove 

     int dotcoma[150]; 
     int j; 
     int c=0; 

     file2 = fopen(file_name, "r");//otvarq faial za chetene 
     if (file2 == NULL){ 
     printf("Cannot open %s\n", file_name); 
     exit(2); 
     }//if 

     for (j = 0; j < 150; j++) 
     dotcoma[j]=0; 

     do{ 
     c = fgetc(file2); 
     if (c == '\n') rows++; 

     if (';' == c) 

      dotcoma[rows-1] ++; 



     } while (c != EOF && rows <= 150);//chete do kraq na faila 

     if (ferror(file2)){ 
     printf("Error reading file.\n"); 

     }//if 

     printf("The number of the symbols on a row "); 
     printf("Row %d: %f\n", j + 1, (float)dotcoma[j]); 

    } 

    if (fclose(file2) == EOF){ 
     printf("Cannot close %s\n", file_name); 

    } 
    _getche(); 
    return 0; 
} 
+0

один очевидный недостаток: что делать, если ваш файл имеет более 150 строк? – MightyPork

+0

Показать результат для всех 150 отдельных линий. –

+0

Я считаю, что printfs вызываются только один раз после того, как все будет прочитано. Не совсем уверен, в чем цель: – MightyPork

ответ

1

У вас почти все на месте. Единственное изменение, которое нужно сделать, это поставить линию

 printf("Row %d: %f\n", j + 1, (float)dotcoma[j]); 

в for петлю и изменить формат из %f в %d.

printf("The number of the symbols on a row \n"); 
    for (j = 0; j < rows; j++) 
    { 
    printf("Row %d: %d\n", j + 1, dotcoma[j]); 
    } 

Вы должны убедиться, что rows остается на 150 или ниже. В противном случае вы получите доступ к массиву dotcoma за пределы. Один из способов сделать это можно:

do{ 
    c = fgetc(file2); 
    if (c == '\n') rows++; 

    if (';' == c) 
     dotcoma[rows-1] ++; 

    } while (c != EOF && rows <= 150);//chete do kraq na faila 
+1

@chux, спасибо, что указали это. Я обновил ответ, чтобы исправить проблему у источника. –

+0

Непонятно, почему ваш ответ был незаслуженно проголосован. – chux

+2

@chux, это одна из тех вещей, которые делают многие пользователи SO. У каждого свои причины, и я научился игнорировать их, когда они не сопровождаются конструктивной обратной связью. –

0

Я достиг большого прогресса. Он рассчитывает теперь для частоты для каждого ';' для линии и хотел бы добавить новую частоту символов, а также «.» в моем случае, но в нем говорится, что есть Stack arround varriable. Здесь это код работает, но просто без второго символа частота запятая ++ счетчик. Может кто-нибудь дать совет, как это исправить?

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS /* Да си изключа предупрежденията*/ 
#endif 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h>/* For exit() function */ 

int main() 
{ 
    char file_name[1000]; 
    FILE *file2 = 0; 

    gets(file_name); 
    int rows = 1;//broq na vsichki redove 
    int dotcoma[150];//broq na ; 
    int coma[150];//broq na . 
    int j; 
    char c; 

    file2 = fopen(file_name, "r");//otvarq faial za chetene 
    if (file2 == NULL){ 
     printf("Cannot open %s\n", file_name); 
     exit(2); 
    }//if 

    for (j = 0; j<150; j++) 
     dotcoma[j] = 0; 
    coma[j] = 0; 
    do{ 
     c = fgetc(file2); 
     if (c == '\n') rows++; 
     else{ 
      if (c == ';') 
      dotcoma[rows - 1]++; 
      if (c == '.') 
      coma[rows-1]++; 
     } 
    } while (c != EOF);//chete do kraq na faila 


    if (ferror(file2)){ 
     printf("Error reading file.\n"); 
     exit(2); 
    }//if 

    printf("The number of the symbols on a row/the number of all symbols: "); 
    for (j = 0; j<rows; j++){ 
     printf("Row %d: %f %f\n", j + 1, (float)dotcoma[j], coma[j]); 

    } 
    _getche(); 
    if (fclose(file2) == EOF){ 
     printf("Cannot close %s\n", file_name); 
     exit(2); 

     _getche(); 
     return 0; 
    } 
} 
Смежные вопросы