[英]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.