在消除用户输入的原始字符串中的所有空格而不使用任何预定义函数

时间:2018-04-22 16:47:40

标签: c++ c++11

以下是我的完整代码:

#include<iostream>
#include<string.h>
int main()
{
    char x[100];
    int i, pos=0, l;
    std::cout<<"Enter a string: ";
    gets(x);
    l=strlen(x);
    for(i=0;i<l;i++)
    {
        if(x[i]==' ')
            pos+=1;
        x[i]=x[i+pos];
        if(x[i]=='\0')
            break;
    }
    std::cout<<"The final string is: "<<x;
    fflush(stdin);
    getchar();
    return 0;
}

但输出并未按预期进行...... 如果有人指出错误会很高兴......

4 个答案:

答案 0 :(得分:0)

休息的最终检查应该是:

if(X[i+pos] == '\0')
    break;

答案 1 :(得分:0)

问题是,您要继续检查要复制到' '的地方,而不是要复制的地方。

所以它应该是while(x[i+pos]==' ')而不是if(x[i]==' ')while而不是if才能处理一行中的多个空格)

通过使用调试器逐步执行代码并检查所有相关变量的值以查看它们是否符合您的期望,您可以轻松找到这类错误。

答案 2 :(得分:0)

我会将您的代码简化为以下内容:

#include<iostream>

int main()
{
    char x[100];
    std::cout<<"Enter a string: ";
    gets(x);
    std::cout << "The final string is: ";
    for(int i = 0; i < 100; i++)
    {
        if(x[i] == '\0') break;
        while(x[i] == ' ') i++;
        std::cout << x[i];
    }
    getchar();
    return 0;
}

答案 3 :(得分:0)

如果您的目标是更改字符串,那么策略可能是

1)找到第一个空格字符。如果没有找到空格字符,我们可以结束处理。如果找到一个空格,那么这是第一个要改变的位置和第一个要检查的位置(这些是不同的位置,即使它们从同一个地方开始)。

2)使用这两个索引处理字符串,一个指向要检查的位置,另一个指向要更改的位置。

3)如果要检查的位置不是空格,请将其复制到要更改的位置并增加要更改的位置。

4)增加要检查的位置。转到步骤3)直到遇到字符串结尾(要检查的位置是在字符串结尾处)。

5)Null在要更改的位置终止字符串。完成。

以上是上述的实现:

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "Hello, my name is John";
    size_t len = strlen(str);
    size_t change_position = 0;

    // find the first space character
    for (change_position = 0; change_position < len; ++change_position)
    {
        if (str[change_position] == ' ')
            break;  // found it
    }  

    if (change_position != len)  // if we found a space character
    {
        // starting from the first space
        for (size_t check_position = change_position; check_position < len; ++check_position)
        {
            // if the check position is not a space 
            if (str[check_position] != ' ')
            {
               // copy it to the change position
                str[change_position] = str[check_position];
               // update change position  
                ++change_position;
            }
        }
    }

    // finish up by null-terminating the string
    str[change_position] = '\0';
    std::cout << str;
}

Live Example