Zamiana dwóch pętli for na jedną

0

Hej! Mam 2 pętle, które chciałbym zamienić na 1. Oto one:

for(i=0; array[i] != NULL; i++)
    {
        for(j=0; j<n; j++)
        {
            if(warunek)
            {
                printf("%s\n", array[j]);
                break;
            }
        }
    }

próbowałem tak:

for(i=0,j=0; array[i]!=NULL,j<n; i++,j++)
        {
            if(waruenk)
            {
                printf("%s\n", array[j]);
                break;
            }
            if(j == n)
                j = 0;
        }

ale to nie to ...

0

Nie wiem jak w ze składnią ale w warunkach użył bym "and".
Dawno nie tykałem C ale powinno to wyglądać jakoś tak:

array[i]!=NULL && j<n

dodanie znacznika <code class="c"> - fp

0

Składniowo jest ok, ale to nie to - moja pierwsza pętla wyświetla pewien tekst, a tutaj nic - więc jest źle

Napisałem i taką pętlę:

while(array[i]!=NULL && j<n && 1)
        {
            if(warunek)
            {
                printf("%s\n", array[j]);
                break;
            }
            i++;
            j++;
            if(j == n)
                j = 0;
        }

ale nadal nie wyświetla nic :/ więc myślę, że coś tu jeszcze jest nie tak

0

Dopóki nie zobaczę więcej kodu nie jestem w stanie pomóc.
Pętla składniowo wygląda OK.

Prawdopodobnie masz problem z którąś wartością :)

0

Ogólnie chodzi mi o to, aby po znalezieniu jakiejkolwiek nazwy z tablicy "names" przerwać pętlę i nie szukać już dalej ;) Dlatego chciałem z tego 1 pętlę zrobić ...

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

char **getFilenames()
{
    char **filenames = NULL;
    glob_t data;
    unsigned int i;

    switch( glob("./*.*", 0, NULL, &data ) )
    {
    case 0:
        break;
    case GLOB_NOSPACE:
        printf( "Out of memory\n" );
        break;
    case GLOB_ABORTED:
        printf( "Reading error\n" );
        break;
    case GLOB_NOMATCH:
        printf( "No files found\n" );
        break;
    default:
        break;
    }

    filenames = malloc(sizeof(char*)*data.gl_pathc+1);
    for(i=0; i<data.gl_pathc; i++)
    {
        filenames[i] = strdup(data.gl_pathv[i]);
    }
    filenames[i] = NULL;
    globfree( &data );
    return filenames;
}

int main( int argc, char *argv[] )
{
    const char *names[2] = {"./Untitled2.c", "./Untitled1.c"};
    char **filenames = getFilenames();
    char *filename;
    unsigned int i = 0, j = 0;

    for(i=0; filenames[i] != NULL; i++)
    {
        for(j=0; j<2; j++)
        {
            if(!strcmp(filenames[i], names[j]))
            {
                printf("%s\n", names[j]);
                break;
            }
        }
    }

    /*for(i=0; filenames[i] != NULL; i++)
    {
        printf("%s\n", filenames[i]);
    }*/

    for(i=0; filenames[i] != NULL; i++)
    {
        free(filenames[i]);
    }

    return 0;
}
0

Może załóż wątek z pytaniem jak całość zastąpić jedną instrukcją. Masz dwie tabele, więc każda zamiana dwóch pętli na jedną będzie sztuczne i nieczytelne.

0
//n- index ostatniego elementu tablicy names[]

for(i=0; filenames[i] != NULL; i++)
    {
        if(!strcmp(filenames[i], names[j]))
            {
                printf("%s\n", names[j]);
                break;
            }

		if(j==n)
		{
			j=0;
			i++;
		}
		else
		{
		j++;
		}
		i--;
    }


//strzelałem, nie mam jak to sprawdzić czy działa

dodanie znacznika <code class="c"> - fp

0

@gk1982: dziękuję, o to chodziło ;) (jeszcze potestuję, ale wstępnie jest ok :) )

1 użytkowników online, w tym zalogowanych: 0, gości: 1