Перезапуск цикла while в c без целых чисел

Я пытаюсь заставить этот код работать, но я понятия не имею, как перезапустить внутренний цикл while. Как бы я это сделал?

/*
 * Return a pointer to the first occurrence of any character in <stop>
 * in the given <string> or NULL if the <string> contains no characters
 * in <stop>.
 *****
 * YOU MAY *NOT* USE INTEGERS OR ARRAY INDEXING.
 *****
 */
char *find_any_ptr(char *string, char* stop) {

    char *newstring = (char*)0;

    while(*stop != '\0'){
            while(*string != '\0') {
                    if(*string == *stop){
                            if(newstring < string || newstring != (char*)0){
                                    string++;
                            }else{
                                    newstring = string;
                                    string++;
                            }
                    }
            }
            stop++;
    }
    return newstring;   // placeholder
}

4 ответа

Используйте временную переменную для string указатель, и используйте эту временную переменную вместо этого во внутреннем цикле.

while(*stop != '\0'){ 
    char *p = string; 
    while (*p != '\0') { 

        ...    /* use 'p' in place of 'string' */

    }   
    stop++; 
} 

Это относительно просто, если использовать только символьный указатель на string и указатель на stop, Для каждого персонажа в вашем stringсравниваешь с каждым персонажем в stop, возвращая персонажа в string на матч или NULL если совпадений не найдено:

#include <stdio.h>

char *find_any_index(char string[], char stop[]) {

    char *p = string;
    char *sp = NULL;

    while (*p)
    {
        sp = stop;
        while (*sp)
        {
            if (*sp == *p)
                return p;
            sp++;
        }
        p++;
    }

    return NULL;
}

int main (int argc, char **argv) {

    if (argc < 3) {
        printf ("usage:  %s string stoplist\n", argv[0]);
    }

    printf ("\n string: %s\n stop  : %s\n\n", argv[1], argv[2]);
    printf (" first char in string matching a char in stop: %s\n\n", find_any_index (argv[1], argv[2]));

    return 0;
}

Выход

$ ./bin/find_substr_str thisIsAstring mase

 string: thisIsAstring
 stop  : mase

 first char in string matching a char in stop: sIsAstring

Вот демонстрационная программа, которая показывает, как можно написать функцию

#include <stdio.h>

char * find_any_ptr( const char *string, const char* stop )
{
    const char *p, *q;
    _Bool found = 0;

    p = string;
    do
    {
        q = stop;
        while ( *q && *q != *p ) ++q;
    } while ( !( found = *q ) && *++p );

    return ( char * )( found ? p : NULL );
}

int main(void)
{
    const char *p = find_any_ptr( "abc9de", "1234567890" );

    if ( p ) puts( p );

    return 0;
}

Выход программы

9de

Только я бы назвал функцию find_any_char вместо find_any_ptr:)

Это моя реализация:

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

char * findany(char *string, char *stop) {
    char * app; 

    //To avoid segmentation fault!  
    if (stop==NULL || string==NULL || !*stop || !*string)
        return NULL;

    do {
        app=string;
        while(*app!=0 && *app!=*stop)
            app++;
        stop++;
    } while(*app==0 && *stop!=0);

    return (*app!=0)?app:NULL;
}


int main(void)
{
    char string[100];
    char stop[100];
    char * found;

    for(;;) {       
        printf("Insert a string without spaces[q<Enter> to exit]: ");
        scanf("%s",string);
        if (!strcmp(string,"q"))
            break;
        printf("Insert the chars to search without spaces: ");
        scanf("%s",stop);

        printf("Searching any occurence of a char in \"%s\""
            " inside \"%s\"\n",stop,string);

        found=findany(string,stop);
        printf("%s\n",(found!=NULL)?found:"NULL");
    } 

    return 0;
}

Я думаю, что лучше использовать также следующий способ для реализации функции findany():

char * _findany(char *string, char *stop) {
    char * app; // to start the first loop

    //To avoid segmentation fault!  
    if (stop==NULL || string==NULL || !*stop || !*string)
        return NULL;

    do {
        app=stop;
        while(*app!=0 && *app!=*string)
            app++;
        string++;
    } while(*app==0 && *string!=0);

    return (*app!=0)?(string-1):NULL;
}

Вы можете наблюдать разницу между двумя функциями, добавляющими функцию _findany в приведенном выше коде, и вызывать новую функцию, добавляя следующий код после (или до) функции printf в главном выше.

found=_findany(string,stop);
printf("%s\n",(found!=NULL)?found:"NULL");
Другие вопросы по тегам