删除字符串中的空格

时间:2017-07-20 14:29:30

标签: c string

我试图在扫描后删除字符串的空格。该程序编译完美,但它没有显示任何输出,输出屏幕只是在扫描字符串后不断关闭。是否存在逻辑错误或者我的编译器存在问题(我正在使用devc ++编译器btw)。 任何形式的帮助将不胜感激

int main()
{
    char str1[100];
    scanf("%s",&str1);
    int len = strlen(str1);
    int m;
    for (m=0;m<=len;){
        if (&str1[m]==" "){
            m++;
        }
        else {
            printf("%c",&str1[m]);
        }
        m++;
    }
    return 0;
}

编辑:抱歉m = 1的错误,我只是检查我的编译器是否有效,只是碰巧粘贴该代码

5 个答案:

答案 0 :(得分:2)

您的代码包含很多问题,您描述的行为很可能不是因为编译器中存在错误: - )

一些问题:

使用scanf("%s",str1)代替scanf("%s",&str1)。由于str1被定义为字符数组,因此它会根据需要自动衰减为指向char的指针。

请注意,scanf("%s",str1)永远不会读取任何空格,因为"%s"被定义为跳过前导空格并在检测到第一个空格时停止读取。

for (m=1;m<=len;)str1[m]中,请注意C中的数组使用从零开始的indizes,即str1[0]..str1[len-1],这样m <= len超出了数组范围。请改用for (m=0;m<len;)

表达式&str1[m]==" "从类型角度来看是正确的,但在语义上是无意义的。您正在将m字符的内存地址与字符串文字" "的内存地址进行比较。请改用str1[m]==' '并注意单引号表示字符值而不是双引号表示字符串文字。

语句printf("%c",&str1[m])将字符的内存地址传递给printf而不是预期的字符值本身。请改用printf("%c",str1[m])

希望我找到了一切。纠正这些事情,打开编译器警告,并尝试获得成功。如果您遇到进一步的麻烦,请不要犹豫再次询问。

希望在体验C语言方面有所帮助: - )

答案 1 :(得分:2)

有很多问题:

  1. 您无法使用scanf("%s")读取包含空格的字符串,而是使用fgets(请参阅注释)。
  2. scanf("%s", &str1)无论如何都应该是scanf("%s", str1);str1已经是字符串的地址
  3. for (m = 0; m <= len;)错误,应为for (m = 0; m < len;),否则您要检查的最后一个字符是NUL字符串终结符。
  4. if (&str1[m]==" ")错误,您应该写if (str1[m]==' ')" "不表示空格字符,而是字符串文字,您需要' '代替..
  5. printf("%c", &str1[m]);错误,您要打印char,因此您需要str1[m](不含&)。
  6. 您应该删除m++并将其放入for语句:for (m = 1; m < len; m++),这会使代码更清晰。
  7. 可能还有一些问题。

    顺便说一句,你的尝试不会从字符串中删除空格,它只显示字符串跳过空格。

答案 2 :(得分:1)

这里有许多较小的错误正在加起来。

首先,检查for循环的边界。您正在从索引1迭代到索引strlen(str1),包括在内。这是一个合理的尝试,但请记住,在C中,字符串索引从0开始,最高可达strlen(str1)。你怎么调整循环来处理这个?

其次,看看这一行:

if (&str1[m] == " ") {

在这里,您尝试检查给定字符是否为空格字符。但是,这并不是你认为它做的。该表达式的左侧&str1[m]是字符串str1的第m个字符的内存地址。这应该让你暂停一下,因为如果你想比较给定位置的内存的内容,你就不应该查看地址那个记忆位置。事实上,这行代码的真正含义是&#34;如果数组中字符m的地址等于包含空字符串的字符串文字的地址,那么......,&#34;这不是你想要的。

我怀疑你可能先写下这一行开始了:

if (str1[m] == " ") {

这更接近你想要的,但仍然不太正确。在这里,表达式的左侧正确地表示&#34; str1的第m个字符,&#34;它的类型是char。然而,右侧是一个字符串文字。在C中,字符(单个字形)和字符串(字符序列)之间存在差异,因此不允许进行此比较。要解决此问题,请将行更改为“

if (str1[m] == ' ') {

这里,通过使用单引号而不是双引号,右侧被视为&#34;空格字符&#34;而不是&#34;包含空格的字符串。&#34;这些类型现在匹配。

有关此代码的其他一些细节需要进行一些清理。例如,看看你如何打印每个角色。这是将printf与角色一起使用的正确方法吗?想想我们上面讨论的if语句,看看你是否可以修补你的代码。同样,看看你如何阅读字符串。而且这里和那里可能会有更多的小问题,但其中大多数都是这些现有主题的变体。

但我希望这有助于让你朝着正确的方向前进!

答案 3 :(得分:0)

For循环应从0开始,小于长度(不小于或等于)

字符串比较是错误的。应与char比较&#39; &#39; ,没有&amp;

快速发现不应做任何事情,非空间输出。你++两次。

&安培; on%c输出是地址而不是值

从内存来看,无论如何,scanf都会在空白处停止,因此需要fgets

    int main()
{
    char str1[100];
    scanf("%s",str1);
    int len = strlen(str1);
    int m;
    for (m=0;m<len;++m){
        if (str1[m]!=' '){
            printf("%c",str1[m]);
        }

    }
    return 0;
}

答案 4 :(得分:0)

你的逻辑中几乎没有错误。

  • scanf在遇到任何spacenew line时终止字符串。 阅读更多相关信息here。因此,请使用其他人说的fgets

  • {li>

    &中的C代表地址。由于数组在C中实现为指针,因此不建议在从&获取字符串时使用stdin。但scanf可以像scanf("%s",str1)scanf("%s",&str[1])

    一样使用
  • 在递增索引时,将m++置于其他条件中。

  • C中的数组索引从0开始而不是1。

因此,在这些更改后,代码将类似于

int main()
{
    char str1[100];
    fgets(str1, sizeof str1 , stdin);
    int len = strlen(str1);
    int m=0;
    while(m < len){
        if (str1[m] == ' '){
            m++;
        }
        else {
            printf("%c",str1[m]);
            m++;
        }

    }
    return 0;
}