Unix で C プログラムを書いていますが、配列要素を NULL に設定する方法がわかりません。文字列から複数の文字を削除するには、これを実行できる必要があります。
3 に答える
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
がある場合は、char[]
これを使用して個々の要素をゼロにすることができます:
char arr[10] = "foo";
arr[1] = '\0';
NULL
これは の代入と同じではないことに注意してください。arr[1]
は でchar
ありポインターではないため、代入することはできませんNULL
。
そうは言っても、それはおそらくあなたが思っていることをしないでしょう。上記の例では、期待どおりf
ではなく、 string が生成されます。fo
文字列から文字を削除する場合は、次のmemmove
ポインター演算を使用して、文字列の内容を左にシフトする必要があります (null ターミネーターを含む)。
例:
#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 */
ポインターの配列 (たとえばchar **
) について話している場合は、単に と言うだけarray[element] = NULL;
です。しかし、本当に文字列 ( ) を切り捨てたいだけのように聞こえます。char *
この場合、実際には を書きたいと思います。string[index] = '\0'
どこ\0
に null バイトがありますか。しかし、私が知る限り、0
、'\0'
、およびNULL
はすべて等価で 0 です (間違っている場合は訂正してください)。もちろん、明確にする0
ために、数値、'\0'
文字と文字列、およびNULL
ポインターに使用する必要があります。