简体   繁体   中英

Saving numbers (sequence of digits) from a string in an array of pointers to a char

I am supposed to save every sequence of digits from a string in an array of chars , this is what i tried:

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

int check_number(char *s) {

    for (; *s; ++s) {
        if (!isdigit(*s))
            return 0;
    }

    return 1;
}

void int_in_string(char *s, char **ar, int MaxCap) {

    char temp[100];
    int index = 0;
    int i = 0;
    for (; *s; s++) {
        if (index == MaxCap) {
            break;
        }
        if (isdigit(*s)) {
            temp[i++] = *s;
        }
        if (*s == ' ' && check_number(temp)) {
            ar[index++] = temp;
            memset(temp, '\0', i);
            i = 0;
        }
    }
    if (index == 0) {
        printf("no numbers in string");
    }
    for (int i = 0; i < index; i++)
        printf(" %s \n", ar[i]);
}

but this code only prints several newlines , can someone explain me what i do wrong?

Some issues:

ar[index++]=temp;

This is just storing the same value (the address of temp ) over and over. What you need to do is copy the string into the array.

Also, you need to terminate the string temp with '\\0' . You handle this in all but the first string with memset(temp, '\\0', i); However, since local variables are not initialized, you need to do it:

char temp[100] = {0}

Or, you can remove the initialization and the memset by just adding the EOS:

temp[i] = '\0';

Lastly, since you declare the original array as

char * ar[10];

You are not allocating any space for the strings. The simplest way to handle that is with strdup .

void int_in_string(char *s, char **ar, int MaxCap)
{
    char temp[100];
    int index = 0;
    int i = 0;
    for (; *s; s++) {
        if (isdigit(*s)) {
            temp[i++] = *s;
            // Need to avoid buffer overflow
            if (i == sizeof(temp)) {
                i = 0;
            }
        }
        if (isspace(*s)) {
            temp[i] = '\0';
            // strdup will allocate memory for the string, then copy it
            ar[index++] = strdup(temp);
            // if (NULL == ar[index-1]) TODO: Handle no memory error
            i = 0;
            if (index == MaxCap) {
                break;
            }
        }
    }
    if (index == 0) {
        printf("no numbers in string");
    }
    for (int i = 0; i < index; i++) {
        printf(" %s \n", ar[i]);
        // free the mem from strdup
        free(ar[i]);
    }
}

I believe some systems may not have strdup() . If not, it can be easily replicated:

char * my_strdup(const char *src)
{
    if (src == NULL) return NULL;
    char *dest = malloc(strlen(src) + 1);
    if (dest == NULL) return NULL;
    strcpy(dest, src);
    return dest;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM