2012-09-21 66 views
1

我正在Unix中編寫一個C程序,但無法弄清楚如何將數組元素設置爲NULL。我需要能夠做到這一點從字符串中刪除多個字符。如何在C程序中將數組中的元素設置爲null

+4

顯示一些代碼。你試過什麼了? –

+0

你的意思是你想通過在某個位置添加NULL字符來縮短字符串嗎? 只需爲其分配'\ 0'即可。 – Luke

+3

空字節是一個字符串*終止符* - 如果要刪除字符,則需要將下列字符左移,而不是用空覆蓋「壞」字符。 – DCoder

回答

6

您不能將null分配給特定的char數組索引,因爲該索引表示的值是char而不是指針。但是,如果你需要從給定的字符串中刪除特定字符,就可以實現這個如下

void removeChar(char *str, char garbage) { 

    char *src, *dst; 
    for (src = dst = str; *src != '\0'; src++) { 
     *dst = *src; 
     if (*dst != garbage) dst++; 
    } 
    *dst = '\0'; 
} 

測試程序

#include<stdio.h> 
int main(void) { 
    char* str = malloc(strlen("abcdef")+1); 
    strcpy(str, "abcdbbbef"); 
    removeChar(str, 'b'); 
    printf("%s", str); 
    free(str); 
    return 0; 
} 

輸出

acdef 
+0

很好的答案,但恐怕不一定適合這個問題。 –

+0

這確實與所問的問題無關。 – netcoder

+0

恐怕'char數組[10];'不會被初始化爲一堆零。事實上,當你不初始化一個變量,而只是像你一樣聲明它時,先前存儲在內存中的值通常會被分配給它。你只是爲你的變量保留內存,而不是「清理」它,因此內存中的內容仍然存在,它是變量的當前值。事實上,不要初始化像這樣的變量:'char string [size];'而是像這樣:'char string [size] =「」;'。 – noize

0

如果你在談論一個數組的指針(說char **),你只能說array[element] = NULL;。但它聽起來好像你真的想截斷一個字符串(char *),在這種情況下,你實際上想寫string[index] = '\0',其中\0是空字節。但據我所知,0,'\0'NULL都等於0(請糾正我,如果我錯了)。當然,爲了清楚起見,您應該使用0作爲數字,'\0'作爲字符和字符串,而NULL作爲指針。

+0

'NULL'通常是'(void *)0',那麼會引發一個「賦值使指針無法投射的指針」的提示。而在少數平臺上,NULL指針不是全零位,它可能會產生錯誤的結果。 –

2

如果你有char[],您可以使用這種零出各個元素:

char arr[10] = "foo"; 
arr[1] = '\0'; 

注意,這是不一樣的分配NULL,因爲arr[1]char,而不是一個指針,不能將NULL分配給它。

這就是說,這可能不會做你認爲它會。上面的例子會產生字符串f,而不是你所期望的fo

如果您想從一個字符串中刪除字符,則必須將字符串的內容轉移到使用memmove左側(包括空終止)和一些指針運算:

實施例:

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

int removechars(char *str, size_t pos, size_t cnt) { 
    size_t len = strlen(str); 
    if (pos + cnt > len) 
     return -1; 

    memmove(str + pos, str + pos + cnt, len - pos - cnt + 1); 
    return 0; 
} 

然後像這樣使用它:

char str[12] = "hello world"; 
if (removechars(str, 5, 4) == 0) /* remove 4 chars starting at str[5] */ 
    printf("%s\n", str);   /* hellold */ 
相關問題