My program has the goal of parsing the string "Ge34eks-f10or-Gee59ks". It does this by using strtok to split on delimiter '-' into three tokens Ge34eks, f10or, and Gee59ks. Each token is passed into num_extraction func with the goal of getting the numbers from each token: 34, 10, 59. I want to keep spaces between each token's numbers, so they will be stored in an array with a zero in between each number : [34, 0, 10, 0, 59]. When attempting to print array nothing appears. Note: The while loop handles the second and third token, so if it is commented out, the first token number,34,is correctly printed.
Specific issue: Nothing is printed? And no error is given Guesses: Either something wrong with my count variable or my array is not properly storing the numbers.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int* num_extraction(char* a, int* arr, int* index)
{
char* p = a;
//int i = 0;
while (*p)
{ // While there are more characters to process...
if (isdigit(*p) || ((*p == '-' || *p == ' ') && isdigit(*(p 1))))
{
// Found a number
arr[*index] = strtol(p, &p, 10); // Read number
//printf("%d\n", val); // and print it.
*(index) ;
}
else
{
// Otherwise, move on to the next character.
p ;
}
}
return arr;
}
int main()
{
char str[] = "Ge34eks-f10or-Gee59ks";
int array[100] = { 0 };
//int* p = array;
int count = 0;
int* q = &count;
// Returns first token
char *token = strtok(str, "-");
num_extraction(token, array, q);
count = 2;
// Keep printing tokens while one of the
// delimiters present in str[].
while (token != NULL) // problem starts here if loop is commented out first token number is printed
{
//printf("%s\n", token);
token = strtok(NULL, "-");
num_extraction(token, array, q);
count = 2;
}
for(int i = 0; i < count; i )
{
printf("%d\n", array[i]);
}
//printf("%d\n", count);
return 0;
}
Verion 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char* char_extraction(char* a, char* arr, int* index)
{
char* p = a;
for( int i = 0; i < strlen(p); i )
{
printf("%s\n", "test"); // ISSUE: ONLY PRINTS TWICE?
if(isalpha(p[i]))
{
arr[*index] = p[i];
//printf("%c\n", arr[*index]);
*(index) ;
}
}
return arr;
}
int main()
{
char str[] = "Ge34eks-f10or-Gee59ks";
int array[100] = { 0 };
char array1[100] = "";
int count1 = 0;
int* r = &count1;
// Returns first token
char *token = strtok(str, "-");
char_extraction(token, array1, r); // called once
count1 = 2;
// Keep printing tokens while one of the
// delimiters present in str[].
while ((token = strtok(NULL, "-")) != NULL)
{
char_extraction(token, array1, r); // should be called twice
count1 = 2;
}
for(int i = 0; i < count1; i )
{
printf("%c\n", array1[i]);
}
//printf("%d\n", count);
return 0;
}
CodePudding user response:
look here - see inline comments
while (token != NULL)
{
// token not null here from last loop
token = strtok(NULL, "-");
// now token is null if last
num_extraction(token, array, q);
count = 2;
}
you need to do
// get next token then test if NULL
while ((token = strtok(NULL, "-")) != NULL)
{
num_extraction(token, array, q);
count = 2;
}
or
// get next token then test if NULL
for(;;)
{
token = strtok(NULL, "-");
if(token == NULL) break;
num_extraction(token, array, q);
count = 2;
}
or even
while (token = strtok(NULL, "-"))
{
//printf("%s\n", token);
num_extraction(token, array, q);
count = 2;
}