如何用C中的任何内容替换空格和制表符?

时间:2009-11-14 18:02:01

标签: c replace tabs spaces

我写了这个函数:

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呢?

4 个答案:

答案 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);