我写了这个函数:
void r_tabs_spaces(char *input) {
int i;
for (i = 0; i < strlen(input); i++)
{
if (input[i] == ' ' || input[i] == '\t')
input[i] = '';
}
}
然而,当我编译并运行它时,编译器在我尝试输入[i] ='';
的行中抱怨“错误:空字符常量”我怎么能用C呢?
答案 0 :(得分:8)
在C中,字符串是一个字节数组。您不能指定“空字节”,但必须将剩余的字节向前移动。
以下是如何做到这一点的一种方法:
char *write = str, *read = str;
do {
// Skip space and tab
if (*read != ' ' && *read != '\t')
*(write++) = *read;
} while (*(read++));
请记住,C中的文字字符串通常位于写保护内存中,因此您必须先复制到堆中,然后才能更改它们。例如,这通常是段错误:
char *str = "hello world!"; // Literal string
str[0] = 'H'; // Segfault
您可以使用strdup
(以及其他)将字符串复制到堆中:
char *str = strdup("hello world!"); // Copy string to heap
str[0] = 'H'; // Works
编辑:根据您的评论,您可以通过记住您已经看到非空白字符的事实来跳过初始空格。例如:
char *write = str, *read = str;
do {
// Skip space and tab if we haven't copied anything yet
if (write != str || (*read != ' ' && *read != '\t')) {
*(write++) = *read;
}
} while (*(read++));
答案 1 :(得分:1)
如果你有一个指向字符串的指针
" string with leading spaces"
^ pointer
移动它......
" string with leading spaces"
^ pointer
例如:
#include <ctype.h>
/* ... */
char mystring[] = " string with leading spaces";
char *pointer = mystring;
while (*pointer && isspace((unsigned char)*pointer)) ++pointer;
/* pointer now points to a (possibly empty) string with no leading spaces */
答案 2 :(得分:0)
删除字符串字符的方法是将字符串的其余部分移回一个字符。
答案 3 :(得分:0)
使用
foo += strspn(foo, " \t");
将指针foo
移动到第一个不是空格或制表符的字符。
要从动态分配的字符串中实际删除字符,请使用
size_t offset = strspn(foo, " \t");
size_t size = strlen(foo + offset) + 1;
foo = realloc(memmove(foo, foo + offset, size), size);