Hey guys I have been trying to expand the following code but have had no luck, is there anyway I could also make this code say if the previous character is space or a is comma? Thanks.

//temp is the array ch is a char pointer
if( ch == temp || isspace (*(ch-1)))

Dani AI

Generated

A few focused notes that tie together ’s and ’s suggestions and explain the common pitfalls that lead to the “8 ints / 4 chars” symptom.

The usual causes are (1) scanning more of the file than you think (start/end not isolated), (2) not advancing the search pointer past the match reliably, or (3) printing the wrong variable (C/C++ is case‑sensitive). For example, if you search the entire file rather than the text inside the parentheses you will pick up other int occurrences; if you forget to null‑terminate a substring you may run past the intended end; and a typo like incrementing iCount but printing icount will show a bogus value. Also, the expression ch && ch == string just checks that ch is non‑NULL and equal to string — redundant inside a while((ch = strstr(...)) != 0) loop, since ch cannot be NULL there.

A more robust approach is: extract the text between ( and ), copy it into a mutable buffer, split on commas, trim whitespace from each token, and then check the leading word with strncmp (so you don’t accidentally match integer or sprint). That avoids fragile pointer arithmetic and whitespace/commas quirks.

Example sketch (illustrates the idea — not a drop‑in from the thread):

/* copy between '(' and ')' into params[], then */
char *tok = strtok(params, ",");
while (tok) {
    while (isspace((unsigned char)*tok)) tok++;
    if (strncmp(tok, "int", 3) == 0 && (tok[3] == '\0' || isspace((unsigned char)tok[3])))
        intCount++;
    else if (strncmp(tok, "char", 4) == 0 && (tok[4] == '\0' || isspace((unsigned char)tok[4])))
        charCount++;
    tok = strtok(NULL, ",");
}

Quick checklist: confirm the substring is properly delimited (null‑terminated), use a mutable buffer for strtok, trim tokens, use strncmp with a follow‑up check to ensure a true word match, and inspect pointer/variable names in the debugger or with temporary prints to rule out typos.

Recommended Answers

All 15 Replies

char ch = temp[ i - 1]; // i is the current position ; i must be greater than 0
if( ch == ' ' || ch == '\'')

or

// i is the current position ; i must be greater than 0
if( temp[ i - 1]== ' ' || temp[ i - 1]== '\'')

hi thanks for the reply I couldn't get it to work here is the code at the moment it deals with if it is at the start or previous character is whitespace but i also need the or comma clause.

while((ch = strstr( ch, "test ")) != 0)
	{
							
		if( ch == temp || isspace (*(ch-1)))
		{
			count++;
			ch++;								 
			
		}
							
			else
			 {
							
			break;
			}
		}
#include <iostream>
int main()
{
	char* test = "testing is a'test string";
	char* ch = test;
	int count = 0;
	while( (ch = strstr( ch, "test")) != 0)
	{
		if ( ch != test )// Check if you are at the beginning of the string
		{
			ch--;
			if( ch[ 0 ] == ' ' || ch[ 0 ] == '\'')
			{
				count++;
				ch ++;
				// Output the result
				std::cout << count << std::endl;
				std::cout << ch << std::endl;
				ch ++;
			}
		}
		else
		{
			count++;
			std::cout << count << std::endl;
			std::cout << ch << std::endl;
			ch++;
		}
	}
	return 0;
}

Modify for your requirements.

>>it is at the start or previous character is whitespace but i also need the or comma clause.


just add more || operators on that line!

if( ch == temp || isspace (*(ch-1)) || *(ch-1) == ',')

or you could use a switch statement

switch(*(ch-1))
{
  case ' ':
  case '\t':
  case ',':
   // blabla
   break;
}

Thanks for you help guys, in my program at the moment I am trying to count int & char paramters, I have the code that starts the array after the open brace and I am using the code below to give the the parameter count but for some reason the count is wrong, it says I have 8 ints and 4 chars any idea where i went wrong? Thanks.

//text file contents
int test (int f, int k, char u,int f, int a, char h)
while((ch = strstr( ch, "int ")) != 0)
	{
							
		if( ch == temp || isspace (*(ch-1)) || *(ch-1) == ',')
			{
			    intCount++;
			   ch++;								 
			
			}
							
				else
					 {
							
					break;
					}
						}


		ch=temp;

	while((ch = strstr( ch, "char ")) != 0)
		{
							
		if( ch == temp || isspace (*(ch-1)) || *(ch-1) == ',')
		{
			charCount++;
			ch++;								 
			
		}
							
		else
			 {
							
			break;
			}
						
}

see if this helps.

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

int getCount(char* string,char* dataType)
{
	int counter = 0;
	char* ch = string;
	while((ch = strstr( ch, dataType)) != 0)
	{
							
		if( ch && ch == string || isspace (*(ch-1)) || *(ch-1) == ','|| *(ch-1) == '(')
		{
			counter++;
			// bypass everything up to the next space
			while(!isspace(*ch))
				ch++;								 
		}						
		else
		{						
			break;
		}
	}
	return counter;
}

int main(int argc, char* argv[])
{
	char str[] = "int foo(int f, int k, char u,int f, int a, char h)";
	int intCount;
	int charCount;
	intCount = getCount(str,"int ");
	charCount = getCount(str,"char ");
	
	printf("intCount: %d charCount: %d\n",intCount,charCount);
	return 0;
}

Can you give me any advice acient dragon?

Can you give me any advice acient dragon?

Yes, learn to read and comprehend what you read. I posted working code for you. Compare it with what you have to see what you are doing wrong.

thanks I will look into it now

I am still getting the wrong number of ints (8) and chars(4) the only difference between the code I tested and the code you have is that I started the array after the first brace and the array data was obtained from a text file so it was:

int f, int k, char u,int f, int a, char h)

I am also not sure what the following does?

ch && ch == string

Could the problem be with the way I am using arrays or does it matter that some parameters may have whitespace after the comma and some don't?

Thanks again.

>>the only difference between the code I tested and the code you have is that I started the array after the first brace and the array data was obtained from a text file so it was:


No it isn't. Check the loop very carefully -- the if statement is larger and there is a while statement you do not have.

repost your current program.

>>or does it matter that some parameters may have whitespace after the comma and some don't?

That should not be a problem because the if statement is checking for both conditions.

Hi this is my code I have the longer if and extra while loop.

I am still using the same test data and it says there is 8 ints when there should only be 4 as I started the array just after the first brace.

void test(char* temp)
{


	char * ch=temp;

		
	while((ch = strstr( ch, "int ")) != 0)
	{
							
	if( ch && ch == temp || isspace (*(ch-1)) || *(ch-1) == ','|| *(ch-1) == '(')
		{
			iCount++;
								    
                       while(!isspace(*ch))
									
			ch++;								 
			
		}
							
				else
				  {
							
					break;
				}
      }

cout<<"no of ints: "<<icount<<endl;
}

Thanks I have got it sorted but I was just wondering what the following part of the code does:

if(ch && ch == string

thanks again

char[]//set the number of required in the memory eg
char bradley[10]

Thanks I have got it sorted but I was just wondering what the following part of the code does:

if(ch && ch == string

thanks again

remove the "ch &&" -- its reduncent and not needed. That just checks to see that ch != NULL, but it can't be NULL when it reaches the if satement due to the line above it.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.