[英]removing blanks from a string in c
我知道这是一个以前被问过很多次的问题,但我不是在要求解决方案本身,而是想知道为什么我的解决方案不起作用。
这是我的解决方案:
void delete_blanks(char *string)
{
while (*string)
{
if (*string == ' ')
*string = '\0';
*string++;
}
puts(string);
}
该程序只是为每个输入打印空白(“”)。
在使用调试器运行时,我看到*string
指向 '\\0' 。 是否可以“就地”进行?
这是在这里找到的原始解决方案:
void RemoveSpaces(char* source)
{
char* i = source;
char* j = source;
while(*j != 0)
{
*i = *j++;
if(*i != ' ')
i++;
}
*i = 0;
}
这是一个很好的就地实现
int main(void) {
char inStr[] = "a cat is on the moon";
int end = 0;
for (int i = 0; i < strlen(inStr); i++) {
if (inStr[i] != ' ') {
if (i != end) {
inStr[end] = inStr[i];
}
end++;
}
}
inStr[end] = '\0';
printf("%s\n", inStr);
}
可能是因为您正在修改源,传递给该函数的参数,当它查找空格时,将源快捷方式为'\\0',因此您没有打印正确的结果。 尝试使用其他指针,例如您给出的示例。
char a[]="it is a sunny morning";
int j=0;
for( int i=0;i<strlen(a);i++){
if(a[i]!=' '){
a[j]=a[i];
j++;
}
}
for(int i=j;i<strlen(a);i++){
a[i]='\0';
}
printf("%s",a);
首先将没有空格的字母分组,然后删除超出空格的字母。
输出 itisasunnymorning
目前还不清楚“删除空白”是什么意思。 如果您只想打印不带空格的字符串,您可以将函数简化为:
void delete_blanks(char *string)
{
while (*string)
{
if (*string != ' ')
putchar(*string);
string++;
}
putchar('\n');
}
如果您想删除底层字符串中的空格,它会变得有点复杂,因为您必须在 ' ' 之后移动字符以填充空白。 没有可以插入的“空字符”来填充字符串中的空洞,您必须移动剩余的字符来填充它。
基本上,您的功能有两个主要问题。 您正在用字符串终止字符替换空格,表示字符串在此处结束。 这不是您想要做的,因为空格后面可能有字符。 事实上,如果你只想打印字符串,你根本不应该修改它。
当您完成对字符串的迭代后,字符串指向字符串的末尾。 本质上将一个空字符串传递给puts()
。 在对它进行大量 ++ 之前,您需要将原始值传递给puts()
当你真正应该做 string++ 时,你也在做*string++
string++。 这实际上有效,因为它被解析为*(string++)
但对于可读性来说很糟糕。
如果要删除字符串单词之间的空格,
直接回答如下:
// #include <ctype.h>
void RemoveSpaces(char *str) {
char *strBuff = (char*) malloc(strlen(str) + 1), *p = strBuff;
while (*str) {
if (!isspace(*str)) {
*p = *str;
p++;
}
str++;
}
*p = '\0';
printf("%s\n", strBuff);
free(strBuff);
}
int main(){
RemoveSpaces("Thank you for help");
}
结果:
此外,还有另一种方法并给出相同的结果如下:
void RemoveSpaces(char *str) {
while (*str) {
if (!isspace(*str)) {
putchar(*str);
}
str++;
}
printf("%s\n", str);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.