поиск по строке - PullRequest
       10

поиск по строке

1 голос
/ 19 сентября 2011

Как мне это реализовать? Я пытаюсь сравнить массив строк c с одной строкой и, если совпадений нет, добавить его в массив 2d.

char*mprt,uni[100][16];
    mprt = &uni[0][0];
for (int s = 0;s <= 99;s++)
        {
            for (int z = 0;z <= 15;z++)
            {
                if (strcmp(mprt++, string1) != 0)
                {
                    uni[s][z] = string1[z];
                }
            }
        }

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Хорошо ... из ваших комментариев я теперь понимаю, что вы пытаетесь сделать. Вы хотели бы превратить это в функцию, чтобы вы могли передавать ей слова, но она должна указывать вам правильное направление.

Обратите внимание, что вы можете использовать char[][], но таким образом ваши строки могут быть любой длины, потому что мы динамически распределяем их, когда мы помещаем их в список.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{

    /* space for 100 strings */
    char **uni = calloc(100, sizeof(char*));
    char **i;

    /* Put one word in the list for test */
    *uni = calloc(5, sizeof(char*));
    strncpy(*uni, "this", 5);

    /* here's the string we're going to search for */
    char * str2 = "that";

    /* go through the first dimension looking for the string 
       note we have to check that we don't exceed our list size */
    for (i = uni; *i != NULL && i < uni+100; i++)
    {
        /* if we find it, break */
        if (strcmp(*i,str2) == 0)
            break;
    }

    /* if we didn't find the string, *i will be null 
     * or we will have hit the end of our first dimension */
   if (i == uni  + 100)
   {
        printf("No more space!\n");
   }        
   else if (*i == NULL)
   {
        /* allocate space for our string */
        *i = calloc(strlen(str2) + 1, sizeof(char));

        /* copy our new string into the list */
        strncpy(*i, str2, strlen(str2) + 1);
    }


    /* output to confirm it worked */
    for (i = uni; *i != NULL && i < uni+100; i++)
        printf("%s\n",*i);
}

Для полноты char[][] версия:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{

    char uni[100][16];
    int i,j;

    /* init our arrays */
    for (i=0;i<100;i++)
        for (j=0;j<16;j++)
            uni[i][j] = '\0';


    /* Put one word in the list for test */
    strncpy(uni[0], "this",15);

    /* here's the string we're going to search for */
    char * str2 = "that";

    /* go through the first dimension looking for the string */
    for (i = 0; uni[i][0] != '\0'  && i < 100; i++)
    {
        /* if we find it, break */
        if (strcmp(uni[i],str2) == 0)
            break;
    }

    /* if we didn't find the string, uni[i][0] will be '\0'
     * or we will have hit the end of our first dimension */
    if (i == 100)
    {
        printf("No more space!\n");
    }
    else if (uni[i][0] == '\0')
    {
        /* copy our new string into the array */
        strncpy(uni[i], str2, 15);
    }

    /* output to confirm it worked */
    for (i = 0; uni[i][0] != '\0' && i < 100; i++)
        printf("%s\n",uni[i]);
}

Изменить, чтобы объяснить C-указатели и массивы из комментариев ниже:

В Си массивы ухудшаются до указателей. Это действительно очень запутанно, когда вы начинаете.

Если у меня есть char myArray[10] и я хочу передать это функции, которая принимает аргумент char *, я могу использовать либо &myArray[0], либо просто myArray. Когда вы опускаете индекс, он ухудшается до указателя на первый элемент в массиве.

В многомерном массиве, подобном вашему, &uni[5][0] == uni[5] - оба являются указателями на первый элемент во втором измерении с индексом 5 в первом. Ухудшается до char*, указанного в начале шестого слова в вашем списке.

2 голосов
/ 19 сентября 2011

В вашем цикле for вам нужно скопировать всю строку, чтобы добавить ее,

Заменить строку на эту,

strcpy(uni[s], string1[z]);

Учитывая, что string1[z] является элементом массиваиз указателей символов.

Редактировать:

Не уверен, что это то, что вы пытаетесь сделать, но в итоге все элементы будут установлены на string1

char string1[] = "String";

char uni[100][16] = {};

for (int s = 0; s < 100; s++)
{
    if (strcmp(uni[s], string1) != 0)
    {
        strcpy(uni[s], string1);
    }
}

Или это без strcpy()

char string1[] = "String";

char uni[100][16] = {};

for (int s = 0; s < 100; s++)
{
    for (int r = 0; r < sizeof(string1); r++)
    {
        uni[s][r] = string1[r];
    }
}
0 голосов
/ 19 сентября 2011

для добавления в конец двумерного массива необходимо использовать динамическое выделение памяти

    const int row_max = 100, col_max = 16;
char** uni = NULL;
char searchString[col_max] = "xyz";
int currentLength = 0;

uni = (char**) malloc (row_max * sizeof(char*)); //TODO:error handling code to be added
for (int row = 0; row < row_max; row++)
{
    uni[row]    = (char*)malloc(col_max * sizeof(char));//TODO:error handling code to be added 
    currentLength = row;
}

for (int row = 0; row < row_max; row++) //fill array uni with data here
{
    uni[row] = "abc";
}

for (int row = 0; row < row_max; row++)
{
    for (int col = 0; col < col_max; col++)
    {
        if (strcmp(&uni[row][col], searchString) != 0 ) 
        {//string not found

            uni = (char**)realloc(uni, (currentLength + 1) * sizeof(char*));//TODO:error handling code to be added 
            uni[currentLength + 1] = (char*)malloc(col_max);//TODO:error handling code to be added 
            currentLength++;
            strcpy(uni[currentLength],searchString); //append at end of 2D array 
            goto stop;
        }
    }
}

stop: for (int row = 0; row <= currentLength; row ++) free (uni [row]));бесплатно (унив); </p>

return 0;
...