2011-09-19 170 views
1

我將如何實現這一點?我試圖比較一個字符串數組到一個單一的字符串,如果沒有匹配追加到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

當字符串相等時,strcmp的返回值爲零。 – cpx

+0

是的,我知道,即時通訊檢查,看看是否沒有匹配,如果沒有添加字符串到數組 –

+0

這個功課?如果是這樣,那很好,但它應該有'家庭作業'標籤 –

回答

2

好的...從...你的意見我現在得到你想要做的。你想把它變成一個函數,這樣你就可以向它提供文字,但它應該讓你指向正確的方向。

請注意,您可以使用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指針和數組:

在C,數組降解爲指針。事實上,當你第一次開始時,這實際上令人困惑。

如果我有char myArray[10],我想傳遞給帶有char *參數的函數,我可以使用&myArray[0]或只是myArray。當您離開索引時,它將降級爲指向數組中第一個元素的指針。

在像你這樣的多維數組中,&uni[5][0] == uni[5] - 兩者都是指向第一個索引5中第二維中第一個元素的指針。它會降低到char*,指向列表中第6個單詞的開頭。

+0

感謝打字,所有出來,生病看我能從中取得什麼,它的一些對我來說是先進的 –

+0

我添加了char [] [] ...一秒。 –

+0

哦,我看起來更容易理解 –

2

在你的循環,你需要將整個字符串複製到其追加,

替換該行,

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

考慮string1[z]爲char類型的數組的元素指針。

編輯:

不知道這是否是你想要做什麼,但你會設置爲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

string1被聲明爲這個char string1 [16]; –

+0

@Bob:在複製之前,您需要確保該字符串以空字符結尾的'\ 0'。 – cpx

+0

從'char'到'const char *'的無效轉換 –

0

要追加到2D陣列的端部需要使用動態存儲器分配

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; 
     } 
    } 
} 

車站: 對(INT行= 0;行< = currentLength;排++) 自由(UNI [行]); free(uni);

return 0;