我尝试返回一个干净的字符串(在字符串的开头或结尾没有空格)
所以我使用动态分配和指针,
char* killspace(char *a)
{
char *enda = NULL;
int i = 0, spaceS = 0, spaceE = 0, bigend = 0 , out = 0, taille = strlen(a);
do
{
if (a[i] == ' ')
{
spaceS++;
}
else
{
out = 1;
}
i++;
} while (out == 0);
out = 0;
do
{
if (a[taille] == ' ')
{
spaceE++;
}
else
{
out = 1;
}
taille--;
} while (out == 0);
bigend = (spaceE + spaceS);
// new size
enda = (char *)calloc((strlen(a)-bigend), sizeof(char));
i = 0;
for (int j = spaceS; j < (strlen(a)-spaceE); j++)
{
enda[i] = a[j];
i++;
}
return(enda);
free(enda);
}
bigend
它在字符串的开头和结尾处是空白的nombre
但作为回报,我得到了我的干净的字符串+ caractre like(ýýýý«««««««««îþîþþþ)
抱歉我的英语不好:(
答案 0 :(得分:3)
将起始地址更改为字符串,需要(1)将地址发送到包含字符串作为参数的指针,以便可以更改或(2)从函数返回指向修剪字符串的新开头的指针。后者可能是你最好的选择。这是一个例子:
#include <stdio.h>
#include <ctype.h>
char *trimstr (char *s)
{
while (isspace(*s)) /* while space, increment pointer */
s++;
char *p = s; /* pointer to string s */
while (*p) p++; /* advance pointer to end of s */
p--; /* decrement pointer off null-term */
while (isspace(*p)) /* while space, set new end of str */
{
*p = 0;
p--;
}
return s; /* return pointer to trimmed string */
}
int main () {
char mystring[] = " some string with leading/trailing WS ";
char *p = mystring;
printf ("\n Original String: '%s'\n\n", mystring);
p = trimstr (mystring);
printf (" Trimmed String : '%s'\n\n", p);
return 0;
}
<强>输出:强>
$ ./bin/trimstr
Original String: ' some string with leading/trailing WS '
Trimmed String : 'some string with leading/trailing WS'
以这种方式解决问题通常会导致更短的代码尝试执行“index-shuffle”以在字符串中向下移动所有字符以覆盖前导空格。但是,“index-shuffle”没有任何问题,你只需要特别注意偏移,并记住也要偏移null-terminator
。
如果您对保存代码行感兴趣,可以按如下方式编写trimstr
函数的更紧凑,尽管稍微不易阅读的版本:
char *trimstr (char *s)
{
while (isspace(*s)) s++; /* while space, increment pointer */
char *p = s; /* pointer to string s */
while (*p) p++; /* advance pointer to end of s */
while (isspace(*(--p))) *p = 0; /* while space, set new end of str */
return s; /* return pointer to trimmed string */
}
答案 1 :(得分:0)
我在我的情况下发现了问题,我在字符串的末尾添加了一个限制器enda[i] = '\0';
,它对我有用