1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C program help

  1. Jul 25, 2010 #1
    C program help!!

    Hey guys im having trouble completing this C program. Its suppose to ask the user to enter a file to read from, read the file, count how many times each word appears and print the results in a different file(also user input) arranged from high occurrence.


    Heres what i have so far

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    typedef struct AWORD
    {
    char wordname[50];
    int count;
    }a_word;

    a_word nword(char* words)
    {
    a_word new;
    strcpy (new.wordname, words);
    return new;
    }

    int compare (words.wordname, words[j].wordname)
    {
    if (words.count < words[j].count)
    {
    return -1;
    }
    else if (words.count > words[j].count)
    {
    return 1;
    }
    else
    {
    return 0;
    }
    }

    int main(int argc, char *argv[])
    {
    int i = 0,j = 0,k = 0, m = 0, count = 0,count2 = 0, count3 = 0, wrdcnt = 1,$
    char cur, cur2[50], file1[25], file2[25], list[1000][k], *buffer;
    FILE *pFile, *pFile2;

    printf("Please type the name of the input file:\n ");
    scanf("%s",file1);
    printf("%s",file1);
    pFile = fopen(file1, "r");

    printf("Please type the name of the output file:\n ");
    scanf("%s",file2);
    pFile2 = fopen(file2, "r");

    while (cur != EOF)
    {
    cur = fgetc(pFile);
    if (cur != ' ')
    {
    list[m][k] = cur;
    fprintf(pFile2, "%c", list[m][k]);
    k++;
    if (cur != '\n' && cur != '\0')
    {
    count2++;
    }
    if (cur == '\n' || cur == '\0')
    {
    wrdcnt++;
    }
    }
    else
    {
    if (cur == ' ')
    {
    wrdcnt++;
    }
    m++;
    k = 0;
    if (cur == '\0')
    {
    fprintf(pFile2,"%s", &cur);
    }
    else
    {
    fprintf(pFile2, "\n");
    }
    }
    }
    fclose(pFile);
    fclose(pFile2);

    pFile2 = fopen(file2, "r");

    a_word words[wrdcnt];

    for (i = 0; i < wrdcnt; i++)
    {
    fgets (cur2, 50, pFile2);
    words = nword(cur2);
    printf("words[%d] is %s", i, words.wordname);
    }
    printf("\n");
    count3 = wrdcnt;
    for (j = 0; j < count3; j++)
    {
    buffer = words[j].wordname;
    for (i = 0; i < wrdcnt; i++)
    {
    if (strcmp(buffer, words.wordname) == 0)
    {
    count++;
    }
    }

    words[j].count = count;
    count = 0;
    }
    printf ("\nWord Counter Program Starting...");
    printf("\nWord Counter Program Finished. Check %s file\n", file2);

    for (j = 0; j < count3; j++)
    {
    for (i = 0; i < j; i++)
    {
    if (strcmp(words[j].wordname, words.wordname) == 0)
    {
    same = 0;
    break;
    }
    else
    {
    same = 1;
    }
    }
    if (same == 1)
    {
    printf ("%d\t%s", words[j].count, words[j].wordname);
    fprintf(pFile2, "%d %s\n", words[j].count, words[j].wordname);

    }

    }
    fclose(pFile2);
    return 0;
    }




    I havent sorted yet. we are suppose to use qsort but i dont think my compare function is right. Any help would be greatly appreciated. Thank you.
     
  2. jcsd
  3. Jul 25, 2010 #2
    Re: C program help!!

    You have to create a list of words and a number for each as you have done (AWORD).

    You then need to do a bubble sort - going through your list of words swapping over any pair that are the wrong way round - you do that multiple times until there are no swaps - then you know it's done.
    So you need to compare a pair of integers - the number of times each word occurs in each pair.

    The declaration for the compare must use a void *. (it can't cope with overloading)
    You will be passing it a pair of integers so you need to cast each to a const void* in the qsort call.
    Then your declaration will look like:-

    int compare (const void *count1, const void *count2)
    {
    //then you cast it back to the type you want - you can do that on-the-fly
    // I think you can see where it goes from here
    if ((int)count1==(int)count2) return 0; //etc.
    }
     
  4. Jul 25, 2010 #3
    Re: C program help!!

    Ok so far i altered the program and gives no errors but when i try to run it it says
    "Segmentation fault".... any ideas?

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    typedef struct AWORD
    {
    char wordname[50];
    int count;
    }a_word;

    a_word nword(char* words)
    {
    a_word new;
    strcpy (new.wordname, words);
    return new;
    }

    int compare (const void *count1, const void *count2)
    {
    if ((int)count1==(int)count2) return 0;
    if ((int)count1<(int)count2) return -1;
    if ((int)count1>(int)count2) return 1;
    }

    int main(int argc, char *argv[])
    {
    int i = 0,j = 0,k = 0, m = 0, count = 0,count2 = 0, count3 = 0, wrdcnt = 1,same;
    char cur, cur2[50], file1[25], file2[25], list[1000][30], *buffer, sorted[1000];
    FILE *pFile, *pFile2;

    printf("Please type the name of the input file:\n ");
    scanf("%s",file1);
    printf("%s",file1);
    pFile = fopen(file1, "r");

    printf("Please type the name of the output file:\n ");
    scanf("%s",file2);
    pFile2 = fopen(file2, "r");

    while (cur != EOF)
    {
    cur = fgetc(pFile);
    if (cur != ' ')
    {
    list[m][k] = cur;
    fprintf(pFile2, "%c", list[m][k]);
    k++;
    if (cur != '\n' && cur != '\0')
    {
    count2++;
    }
    if (cur == '\n' || cur == '\0')
    {
    wrdcnt++;
    }
    }
    else
    {
    if (cur == ' ')
    {
    wrdcnt++;
    }
    m++;
    k = 0;
    if (cur == '\0')
    {
    fprintf(pFile2,"%s", &cur);
    }
    else
    {
    fprintf(pFile2, "\n");
    }
    }
    }
    fclose(pFile);
    fclose(pFile2);

    pFile2 = fopen(file2, "r");

    a_word words[wrdcnt];

    for (i = 0; i < wrdcnt; i++)
    {
    fgets (cur2, 50, pFile2);
    words = nword(cur2);
    printf("words[%d] is %s", i, words.wordname);
    }
    printf("\n");
    count3 = wrdcnt;
    for (j = 0; j < count3; j++)
    {
    buffer = words[j].wordname;
    for (i = 0; i < wrdcnt; i++)
    {
    if (strcmp(buffer, words.wordname) == 0)
    {
    count++;
    }
    }

    words[j].count = count;
    count = 0;
    }
    printf ("\nWord Counter Program Starting...");
    printf("\nWord Counter Program Finished. Check %s file\n", file2);

    for (j = 0; j < count3; j++)
    {
    for (i = 0; i < j; i++)
    {
    if (strcmp(words[j].wordname, words.wordname) == 0)
    {
    same = 0;
    break;
    }
    else
    {
    same = 1;
    }
    }
    if (same == 1)
    {
    printf ("%d\t%s", words[j].count, words[j].wordname);
    fprintf(pFile2, "%d %s\n", words[j].count, words[j].wordname);
    }

    }
    fclose(pFile2);
    pFile2 = fopen(file2, "r");
    m=0;
    while (pFile != NULL)
    {
    fscanf (pFile2 , "%s" , &sorted[m]);
    m++;
    }
    qsort(sorted,m,sizeof(int),compare);
    fclose(pFile2);
    pFile2 = fopen(file2, "w");
    fprintf(pFile2,"%s", sorted);
    return 0;
    }
     
  5. Jul 25, 2010 #4

    Mark44

    Staff: Mentor

    Re: C program help!!

    Are you in the same class as the person who started this thread?

    If you're getting a segmentation fault, you are probably attempting to access memory (via a pointer) that your program is not allowed to access. It's time to learn how to use a debugger.
     
  6. Jul 25, 2010 #5

    jtbell

    User Avatar

    Staff: Mentor

    Re: C program help!!

    Put extra printf() statements in the program so you can pin down exactly where the segmentation fault is occurring:

    "I got to checkpoint #1.
    I got to checkpoint #2.
    I got to checkpoint #3.
    ERROR: Segmentation fault."
     
  7. Jul 26, 2010 #6
    Re: C program help!!

    It means you are attempting to read or write to a part of the memory outside your own program. Usually a pointer error (accessing memory location zero because a pointer is null for example).

    Try temporarily commenting out sections of your program till you locate the line giving the error - then look carefully at any pointers involved.

    Doesn't your debugger automatically stop at error points?
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: C program help
  1. C++ program help! (Replies: 1)

  2. C program help needed (Replies: 3)

Loading...