这里发生了什么?将数组中的值更改为空格

时间:2016-07-27 15:37:13

标签: c arrays

我是在线自学C,我编写了一个测试程序来改变各个数组中的值:

char name [20] = "Michael Blameson";

printf("My name is %s\n", name);
name[0]='P';
name[1]='e';
name[2]='t';
name[3]='e';
name[4]='r';
name[5]="";
name[6]= "";
printf("My name is %s\n", name););

我试图将最后两个空格留空,所以它写着“我的名字是Peter Blameson”。但是,当我运行它时,它写着“我的名字是彼得? Blameson”

这里发生了什么?

6 个答案:

答案 0 :(得分:4)

""是一个字符串文字,是char的不可修改的数组。它将被转换为指向其第一个元素的指针,并且由于name[5]name[6]char,指针将以实现定义的方式转换为整数。

在删除要删除的字符后,不能删除name中的字符(元素)而不删除字符。要将字符更改为空格,可以使用空格字符' '。要转换元素,您可以使用memmove()(不能使用memcpy()也不能使用strcpy(),因为它们在源和目标被包装时无效。

memmove(&name[5], &name[7], strlen(&name[7]) + 1); /* +1 for terminating null-character */

答案 1 :(得分:3)

您不能以这种方式删除字符,需要将其替换为其他字符:

name[5] = ' ';
name[6] = ' ';

当然你最终会打印出来:

My name is Peter   Blameson

哪个不理想。相反,您必须移动剩余的字符(使用memmove)以填充空格:

memmove(&name[5], &name[7], 10);

答案 2 :(得分:1)

使用单引号

name[5]= ' ';
name[6]= ' ';

否则你需要使用标准C函数memmove移动“Blameson”两个位置。

这是一个示范程序

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char name [20] = "Michael Blameson";

    printf( "My name is %s\n", name );

    name[0] = 'P';
    name[1] = 'e';
    name[2] = 't';
    name[3] = 'e';
    name[4] = 'r';

    memmove( name + 5, name + 7, strlen( name + 7 ) + 1 );

    printf( "My name is %s\n", name );

    return 0;
}

程序输出

My name is Michael Blameson
My name is Peter Blameson

或者,如果您不想使用幻数,那么程序可以采用以下方式

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char name [20] = "Michael Blameson";

    printf( "My name is %s\n", name );

    size_t i = 0;

    name[i++] = 'P';
    name[i++] = 'e';
    name[i++] = 't';
    name[i++] = 'e';
    name[i++] = 'r';

    size_t j = strchr( name, ' ' ) - name;

    memmove( name + i, name + j, strlen( name + j ) + 1 );

    printf( "My name is %s\n", name );

    return 0;
}

其输出与上面显示的相同。

My name is Michael Blameson
My name is Peter Blameson

至于陈述

name[5]="";
name[6]= "";

在你的程序中,""是一个字符串文字(而不是字符文字),其类型为数组char [1],初始化为{ '\0' },并且在赋值语句的表达式中是转换为指向其第一个和第一个元素的指针。该计划应该为这些陈述发出信息。

答案 3 :(得分:1)

请注意,您的空格使用双引号(“”)。 在C中,char []的所有字符都用单引号('')或整数ASCII值表示。在这种情况下,你的角色是一个空格 - '',你的ASCII整数是32。

您的“”指的是C字符串文字,它是在运行时创建的常量全局指针。

https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/ASCII-Table-wide.svg/2000px-ASCII-Table-wide.svg.png

答案 4 :(得分:0)

赋值char尝试将指向空字符串开头的指针存储到char数组元素中。双引号表示C中的字符串文字,它们基本上是指向保存字符串的name[5] = ' '; name[6] = ' '; 数组的第一个元素的指针。

如果要分配空格,请使用单引号而不是双引号。单引号表示字符值。 (单引号值实际上可以用作一个字节的整数,但这是不可取的。)

@IBAction func MenuButton(sender: UIButton) {
    if self.MenuView.frame.origin.x == -180 {
        UIView.animateWithDuration(0.5, animations:{
            self.MenuView.frame = CGRectMake(self.MenuView.frame.origin.x + 180, self.MenuView.frame.origin.y, self.MenuView.frame.size.width, self.MenuView.frame.size.height)
        })

    } else {
        UIView.animateWithDuration(0.5, animations:{
            self.MenuView.frame = CGRectMake(self.MenuView.frame.origin.x - 180, self.MenuView.frame.origin.y, self.MenuView.frame.size.width, self.MenuView.frame.size.height)
        })
    }
}

答案 5 :(得分:0)

空格字符不表示为"",它是一个空字符串文字,但是表示为' '(空格空格)。你可能误读了你的书。

修改后的代码为:

char name[20] = "Michael Blameson";

printf("My name is %s\n", name);
name[0] = 'P';
name[1] = 'e';
name[2] = 't';
name[3] = 'e';
name[4] = 'r';
name[5] = ' ';
name[6] = ' ';
printf("My name is %s\n", name);

运行它会产生输出:My name is Peter Blameson

要删除PeterBlameson之间的2个额外空格,您可以使用for循环或字符串库函数:

for (int i = 6; i < 18; i++) {
    name[i] = name[i + 2];
}

或者

memmove(name + 6, name + 8, 12);

这两种方法都会将数组2位置的内容复制到左侧。您不能使用strcpy(name + 6, name + 8),因为如果源和目标数组重叠,strcpy()将调用未定义的行为。