2016-07-27 32 views
1

更改值我自我学习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);); 

我想离开的最后两个空格的空白,所以它写着“我的名字是彼得·拉莫森”。但是,当我运行它时,它会显示“我的名字是彼得? Blameson“

这是怎么回事?

+1

您正在尝试将字符串文字分配给类型为“char”的变量。 – ameyCU

+1

编译器是否说出类似“警告:赋值使得指针中的整数不经过转换”? –

+0

我甚至不明白这是什么意思。 –

回答

1

使用单引号

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

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

这里是一个示范项目

#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' }并且在分配的表达式的类型语句被转换为指向其第一个和单个元素的指针。程序应该为这些语句发出消息。

+0

然后我得到错误“空白字符常量”,期望的表达式 –

+4

您需要使用''<点击空格键>'',而不是''''' –

0

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

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

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

你无法删除的方式,他们需要与其他字符替换字符:

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

当然,你最终会打印:

 
My name is Peter Blameson 

这是不是理想。相反,你必须移动(使用memmove)剩余的字符,直到在空间填写:

memmove(&name[5], &name[7], 10); 
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 */ 
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()会调用未定义的行为。