gpt4 book ai didi

c - 在 C 中使用字符串修剪删除空格、换行符和制表符

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:42 24 4
gpt4 key购买 nike

我试图从互联网上收集资源以了解它的工作原理和功能。基本上,每次读取字符串时我都需要检查空格、换行符和制表符。所以我做了一个函数来处理这种情况:

#include <stdlib.h>
#include <stdio.h>

static int isspace(char c)
{
return (c == '\t' || c == '\n' || c == ' ');
}

然后,我使用下面的函数在另一个函数中实现它

char *my_strtrim(char const *string)
{
char *i;
char *s;
int ready;

i = s;
s = (char *)string;
ready = 0;
while(*i)
{
++i;
if(isspace(*i))
{
if(!ready)
{
continue ;
}
ready = 0;
}
ready = 1;
*(s++) = *i;
}

*s = 0;
return ((char *)string);
}

对于我的 main,我只是做了一个随机测试用例,它处理空格、制表符和换行符:

int main()
{
char str[] = " hello world\n !";
printf("%s",my_strtrim(str));
}

有一个输出错误,my_strtrim 函数中有一个错误,i = s 因为 s 没有 NULL 的结果。错误说:

my_strtrim.c: error: variable 's' is uninitialized when used here [-Werror,-Wuninitialized]
i = s;
^
my_strtrim.c: note: initialize the variable 's' to silence this warning
char *s;
^
= NULL

在我修复它所说的内容(使 s = NULL)之后,我得到了一个段错误。这个问题变得令人困惑,因为它作为 for 循环工作得很好,但作为 while 循环却不行。我需要用 while 循环来解决这个问题。

解决方案我的 friend 给了我一个小技巧/经验法则,让代码简单易懂。我有一个集群函数同时做很多事情;因此,我感到困惑。他指导我并告诉我让我将我的整个功能压缩成小块。

第 0 步:初始化变量并声明

不言自明

第 1 步:获取指针字符串的位置

int     step1_getPosition(char const *string)
{
int i;

i = 0;
while(my_iswhitespace(string[i]))
{
i++;
continue;
}
return (i);
}

第 2 步:复制您的字符串

char    *step2_copyString(char const *string, int pos)
{
char *tmp;
int i;

i = 0;
tmp = my_strnew(my_strlen(string));
if(tmp == NULL)
return (NULL);
while (string[pos] != '\0')
tmp[i++] = string[pos++];
return (tmp);
}

第 3 步:删除空白

char    *step3_removeWhite(char *str)
{
int i;

i = my_strlen(str);
while (str[i] == '\0' || my_iswhitespace(str[i]))
{
str[i] = '\0';
i--;
}
return (str);
}

第 4 步:删除额外的空字节 ('\0')

char    *step4_removeExtraNulls(char *str)
{
char *newstring;

newstring = my_strdup(str);
if(newstring == NULL)
return (NULL);
free(str);
return (newstring);
}

第 5 步:调用主函数并创建其他函数

char    *my_strtrim(char const *string)
{
char *trim;
int i;

i = step1_getPosition(string);
trim = step2_copyString(string, i);
if (trim == NULL)
return (NULL);
step3_removeWhite(trim);
trim = step4_removeExtraNulls(trim);
if (trim == NULL)
return (NULL);
return (trim);
}

我得到的输出是: Hello World !这是正确的

最佳答案

“修剪”前导空白字符的最简单方法是跳过它们,根本不修改字符串。

这依赖于这样一个事实,即 C 语言中的“字符串”可以表示为指向以空字符结尾的字符序列的指针。

以你的字符串为例

char str[] = "                      hello world\n !";

如果我们让数组 str 衰减为指向其第一个元素的指针,则它指向第一个空间。如果我们有一个指向 'h' 的指针呢?那将是一个同样有效的“字符串”。

要获得该指针,我们只需遍历字符串,只要当前字符是空格(当然不是终止符)即可。

将其付诸实践我们得到

char *my_strtrim(char const *string)
{
for (/* empty */; *string && my_isspace(*string); ++string)
{
// Empty
}

return string;
}

在上述函数的循环之后,指针 string或者指向终止符(如果字符串全是空格),或者指向第一个非-字符串中的空格字符。

如果我们像这样使用它

printf("%s\n", my_strtrim(str));

然后它会打印

hello world !

[嵌入的换行符是因为你的字符串中有它。]

应该注意的是,这不会修剪尾随 空格。为此,参数 string 不能是指向常量 字符的指针。

关于c - 在 C 中使用字符串修剪删除空格、换行符和制表符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46628126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com