Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

I need some help to correct this code Instructions The following program takes a string and builds an index of it. The index indicates the:

I need some help to correct this code

Instructions

The following program takes a string and builds an index of it. The index indicates the:

Start of each line in the string,

Start of each word in the string,

Start of each number in the string.

stringhelp.h

#pragma once #ifndef STRINGHELP_H #define STRINGHELP_H

#define MAX_STRING_SIZE 511 #define MAX_INDEX_SIZE 100 #define MAX_WORD_SIZE 23

struct StringIndex

{ char str[MAX_STRING_SIZE + 1]; int wordStarts[MAX_INDEX_SIZE]; int lineStarts[MAX_INDEX_SIZE]; int numberStarts[MAX_INDEX_SIZE]; int numWords, numLines, numNumbers;

};

/** * Return the index of the next whitespace. * @param str - the string to search * @returns the index of the next white space or the position of the string terminator. */ int nextWhite(const char* str);

/** * Return true if the string contains only digits. * @param str - the string to check * @param len - the number of characters to check * @returns true if the string is only digits. */ int isNumber(const char* str, const int len);

/** * Build an index for a string showing the start of the lines, * words, and numbers in the string. * @param str - the string to search * @returns the index of the next white space or -1 if there is none. */ struct StringIndex indexString(const char* str);

/** * Return the number of lines in the index. * @param idx - the index to get the number of lines in it * @returns the number of lines in the index */ int getNumberLines(const struct StringIndex* idx);

/** * Return the number of words in the index. * @param idx - the index to get the number of words in it * @returns the number of words in the index */ int getNumberWords(const struct StringIndex* idx);

/** * Return the number of numbers in the index. * @param idx - the index to get the number of numbers in it * @returns the number of numbers in the index */ int getNumberNumbers(const struct StringIndex* idx);

/** * Return the nth word from the index * @param word - where the result will be placed * @param idx - the index to use * @param wordNum - the index of the word to retrieve * @returns the word or an empty string if index is invalid */ void getWord(char word[], const struct StringIndex* idx, int wordNum);

/** * Return the nth number from the index

* @param word - where the result will be placed * @param idx - the index to use * @param wordNum - the index of the number to retrieve * @returns the number or an empty string if index is invalid */ void getNumber(char word[], const struct StringIndex* idx, int numberNum);

/** * Return a pointer to the start of a line * @param idx - the index to use * @param lineNum - the index of the line to retrieve * @returns a pointer to the start of the line */ char* getLine(struct StringIndex* idx, int lineNum);

/** * Prints characters until the terminator is found. * @param s - the string to print * @param start - the index to start printing * @param terminator - the character to stop printing at when encountered. */ void printUntil(const char* s, const int start, const char terminator);

/** * Prints characters until a space is found. * @param s - the string to print * @param start - the index to start printing */ void printUntilSpace(const char* s, const int start);

#endif

stringhelp.c

#define _CRT_SECURE_NO_WARNINGS #include "stringhelp.h" #include #include

#include

int nextWhite(const char* str)

{ int i, result = -1;

for (i = 0; result < 0 && str[i] != '\0'; i++) {

if (isspace(str[i]))

{ result = i;

} }

return (result < 0) ? i : result; }

int isNumber(const char* str, const int len)

{ int i, result = 1;

for (i = 0; i < len && result; i++)

{ result = result && isdigit(str[i]);

}

return result; }

struct StringIndex indexString(const char* str)

{ struct StringIndex result = { {0}, {0}, {0}, 0, 0, 0 }; int i, sp;

strcpy(result.str, str); if (str[0] != '\0')

{ result.lineStarts[0] = 0;

result.numLines = 1; }

for (i = 0; str[i] != '\0'; i++)

{ while (str[i] != '\0' && isspace(str[i]))

{ if (str[i] == ' ')

{ result.lineStarts[result.numLines] = i + 1;

}

i++; }

sp = nextWhite(str + i);

if (isNumber(str + i, sp - i + 1))

{ result.numberStarts[result.numNumbers++] = i;

}

else

{ result.wordStarts[result.numWords++] = i;

}

i += sp - 1; }

return result; }

int getNumberLines(const struct StringIndex* idx)

{ return idx->numLines;

}

int getNumberWords(const struct StringIndex* idx)

{ return idx->numWords;

}

int getNumberNumbers(const struct StringIndex* idx)

{ return idx->numNumbers;

}

void getWord(char word[], const struct StringIndex* idx, int wordNum)

{ int i, sp, start;

word[0] = '\0'; if (wordNum < idx->numWords && wordNum >= 0)

{ start = idx->wordStarts[wordNum]; sp = nextWhite(idx->str + start); for (i = 0; i < sp; i++) {

word[i] = idx->str[i]; }

word[sp] = '\0';

((struct StringIndex*)idx)->numWords--; }

}

void getNumber(char word[], const struct StringIndex* idx, int numberNum)

{ int i, sp, start;

word[0] = '\0'; if (numberNum < idx->numNumbers && numberNum >= 0) {

start = idx->numberStarts[numberNum]; sp = nextWhite(idx->str + start); for (i = 0; i < sp; i++) {

word[i] = idx->str[start + i]; }

word[sp] = '\0'; }

}

char* getLine(struct StringIndex* idx, int lineNum)

{ char* result = NULL;

if (lineNum < idx->numLines && lineNum >= 0)

{ result = idx->str + idx->lineStarts[lineNum];

}

return result; }

void printUntil(const char* s, const int start, const char terminator)

{ int i;

for (i = start; s[i] != '\0' && s[i] != terminator; i++) printf("%c", s[i]);

}

void printUntilSpace(const char* s, const int start)

{ int i;

for (i = start; s[i] != '\0' && !isspace(s[i]); i++) printf("%c", s[i]);

}

main.c

#define _CRT_SECURE_NO_WARNINGS #include #include "stringhelp.h" #include

#include

int main(void)

{ char testStr[] = { "This is a string with embedded newline

characters and 12345 numbers inside it as well 7890" };

struct StringIndex index = indexString(testStr); int i;

printf("LINES "); for (i = 0; i < index.numLines; i++)

{ printUntil(index.str, index.lineStarts[i], ' ');

printf(" "); }

printf(" WORDS "); for (i = 0; i < index.numWords; i++)

{ printUntilSpace(index.str, index.wordStarts[i]);

printf(" "); }

printf(" NUMBERS "); for (i = 0; i < index.numNumbers; i++)

{ printUntilSpace(index.str, index.numberStarts[i]);

printf(" "); }

return 0; }

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Learn To Program Databases With Visual Basic 6

Authors: John Smiley

1st Edition

1902745035, 978-1902745039

More Books

Students also viewed these Databases questions

Question

List various types of digital system forensic analysis.

Answered: 1 week ago