Goal: count the number of
unique strings from the input stream. The typedef, STRING, scanf, and %s are required. After that, sort each unique string according to how many times its appeared. The output of the program should look like:
word3 6 //word3 has appeared 6 times
word1 3 //word1 has appeared 3 times
word4 2 word4 has appeared 2 times
word2 1 //word2 has appeared 1 time
My approach: use two arrays: int count[] to store the number of occurances, and char* word[100], which stores each string
only if it is unique. The variable
counter is the link between the array indexes: when
counter=4, count[4] is the number of times that the string stored in word[4] has occured. With each iteration of the while loop, a different word from the input is processed.
My problem #1: The incoming word is stored in EVERY single index of count[] before
counter. It should only be stored in word[
counter]. Instead, the end of output looks like:
s not found.
counter is: 4
word in array: dogvvv
it was entered into: word[4]
printing count/word arrays:
count[j] is: 1
word[j] is: dogvvv
count[j] is: 1
word[j] is: dogvvv
count[j] is: 1
word[j] is: dogvvv
count[j] is: 1
I'm getting that just from running this simplified version of it:
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef char STRING[20];
int main(int argc, char *argv[]){
STRING s;
int counter=0;
char* word[100];
int count[100];
int place=0;
int fakebool=1; //acts like a java Boolean variable
int i; int j; int k;
/* How many zeros does these loop write, and how large is your array? */
for(i=0; i<101;i++){count[i]=0;} //fills count[] with 0s
for(i=0; i<101;i++){word[i]=" .";} //fills word[] with “ .”
while(scanf("%s",s)==1){
printf("current word: %s\n",s);
/* What is actually stored here? - what happens on memory? Think this from "memory point of view". At first loop, where at memory is the first word stored? At next loop, where in memory is the next word stored? */
word[place]=s;
printf("s added.\n");
printf("counter is: %i \n", counter);
printf("word in array: %s\n", word[counter]);
printf("it was entered into: word[%i]\n",counter);
count[counter]=1; //because its the first occurrence
printf("count/word arrays: \n");
for(j=0;j<5;j++){
printf("count[j] is: %i",count[j]);
printf(" word[j] is: %s\n",word[j]);
}
counter++;
printf("counter is now: %i \n", counter);
place++;
printf("w: \n");
} //end if not there
}//end while
//exit(0);
//}
Trouble#2: In the longer version of this, I'm having trouble comparing strings, so the program knows whether it should add the incoming string to the end of word[] because it is unique. (If the incoming string is a duplicate of something already entered, it should just increase its value in count[].) But this never recognizes a duplicate word!
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef char STRING[20];
int main(int argc, char *argv[]){
STRING s;
int counter=0;
char* word[100];
int count[100];
int place=0;
int fakebool=1; //acts like a java Boolean variable
int i; int j; int k;
for(i=0; i<101;i++){count[i]=0;} //fills count[] with 0s
for(i=0; i<101;i++){word[i]=" .";} //fills word[] with “ .”
while(scanf("%s",s)==1){
printf("current word: %s\n",s);for(i=0; i<counter;i++){ //check if s is already there
k=strcmp(s,word[i]); //compare the strings
if(k<0){ // s is already in array
fakebool=0;
printf("*******s found.********\n");
count[i]++;
printf("numOccurances: %i \n", count[i]);
printf("the count/word arrays: \n");
for(j=0;j<5;j++){
printf("count[j] is: %i",count[j]);
printf(" word[j] is: %s\n",word[j]);
}
printf("ended found printer \n");
counter++; //it has been added
} //end if there
//printf("ended if found \n");
}//end check for
if(fakebool==1){
printf("s not found.\n");
word[counter]=s;
printf("s added.\n");
printf("counter is: %i \n", counter);
printf("word in array: %s\n", word[counter]);
printf("it was entered into: word[%i]\n",counter);
count[counter]=1; //because its the first occurrence
printf("count/word arrays: \n");
for(j=0;j<5;j++){ //printing the arrays
printf("count[j] is: %i",count[j]);
printf(" word[j] is: %s\n",word[j]);
}
}// end the if()fakebool=1 statement
counter++;
printf("counter is now: %i \n", counter);
printf("w: \n");
} //end if not there
}//end while
//exit(0);
//}
Perhaps using a 2-dimensional array would help, but I haven't used those in C yet, but if it makes it simpler, that's good...