文本文件每行上特定符号的频率

时间:2014-12-17 19:13:17

标签: c arrays string

我正在制作一个C程序来计算符号;.的出现次数,并显示文本文件每行的频率。

我的代码仅适用于dotcoma的一个符号计数器(计数;),当我添加另一个计数器变量昏迷(计数.)时,它会给我一个错误。

  

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 ");
        for (j = 0; j<rows; j++){
            printf("Row %d: %f  %f\n", j + 1, (float)dotcoma[j], (float)coma[j]);

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

            _getche();
            return 0;
        }
    }

3 个答案:

答案 0 :(得分:0)

尝试修复coma初始化!你忘了括号!

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

答案 1 :(得分:0)

在这里。

 #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 ");
        for (j = 0; j<rows; j++){
            printf("Row %d: %f  %f\n", j + 1, (float)dotcoma[j], (float)coma[j]);

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

            _getche();
            return 0;

答案 2 :(得分:0)

return语句在if(fclose ...)里面,这意味着编译器会发出关于缺少return语句的警告

dotcoma和coma数组的初始化失败了,因为&#39;如果&#39;只处理一个代码块和昏迷[j] = 0;不在代码块内,这是始终围绕每个代码块放置{和}的另一个好理由

在DOS / Windows下,新行是两个字符,所以这一行:if(c ==&#39; \ n&#39;)显示&#39; c&#39;应该是一个int,而不是一个char

关于这一行:FILE * file2 = 0; file2是一个指针,而不是一个整数,所以该行应该是:FILE * file2 = NULL;

为了避免编辑问题并简化将来的维护,这个神奇的数字&#39; 150应定义为&#39; #define MAX_COUNT(150)&#39;然后应该在所有情况下使用MAX_COUNT而不是文字150 应该对file_name

应用类似的注意事项

函数:getchar()返回一个int值(因此可以识别EOF)所以这一行:&#39; char c;&#39;应该是&#39; int c;&#39;

exit()原型在stdlib.h中而不是conio.h

关于这一行:gets(file_name); gets()充满了安全问题和许多其他问题。它是从C语言折旧的。使用fgets()会更好,因为它限制了读取的字符数,因此不会发生输入缓冲区溢出。

#include <stdio.h>
#include <stdlib.h> /* For exit() function */
#include <string.h>
#ifdef _MSC_VER
    #define _CRT_SECURE_NO_WARNINGS /* Да си изключа предупрежденията*/
    #include <conio.h>
#endif

#define MAX_ROWS (150)
#define MAX_FILENAME_LEN (1000)

int main()
{
    char file_name[MAX_FILENAME_LEN];
    FILE *file2 = NULL;

    if( NULL == fgets(file_name, MAX_ROWS, stdin)
    {
        perror( "fgets failed" );
        exit( EXIT_FAILURE )
    }

    // implied else, fgets successful

    int rows = 1;//broq na vsichki redove
    int dotcoma[MAX_ROWS] = {0};//broq na ;
    int coma[MAX_ROWS] = {0};//broq na .
    int j; // index/loop counter
    int c; // char input from console

    if( NULL == (file2 = fopen(file_name, "r") )//otvarq faial za chetene
    {
        perror( "fopen failed for input file" );
        exit(2);
    }//if

    // implied else, fopen successful

    while( EOF != (c = fgetc(file2) )
    {
        switch( c )
        {
            case '\n':
                rows++;
                break;

            case ';':

                dotcoma[rows - 1]++;
                break;

            case '.':
                coma[rows-1]++;
                break;

            default: // all other characters
                break;
        } // end switch
    }  // end while

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

    fclose( file2 );
    getchar(); // wait for user to read screen and enter a char

    return 0;
} // end function: main