2013-07-24 83 views
0

在这里,我正在尝试在我的代码中的以下事情,并得到以下error---"prog.c:10:8: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’"。请帮忙,告诉我我该怎么修改我的初始化是char str[100]得到正确的答案字符串初始化错误

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 

    char str[100]; 


    str = "a"; 
    str = str + 1; 
    str = "b"; 
    str = str + 1; 
    str = "c"; 
    str = str + 1; 

    printf("%s", str - 2); 
    return 0;  
} 
+2

您不能将字符串文字分配给数组。 – chris

+3

我敢肯定,这个问题应该在C编程良好的书中得到解答。 – soon

+0

数组名称是常量和'str',所以,你不能修改它,编译器应该给出错误 –

回答

0

你必须使用字符串命令一样的strcpy/strncpy()函数。

或者你可以分配内存来容纳字符串,只使用字符指针,不使用字符数组。

0

治疗str作为一个阵列,而不是作为一个指针(str指向分配给100个字符和str[i]存储器地址访问的str + i相对存储器地址)

char str[100]; 

str[0]='a'; 
str[1]='b'; 
str[2]='c'; 
str[3]='\0'; 

printf("%s",str); 
0

而数组和指针在密切相关的C,它们不完全相同。

char str[100]; 

给你一个“常量指针”般的处理,以100 char秒的预分配的数组。这个数组将存储在内存中的一个固定位置,所以你不能让str指向其他地方。

str="a"; 

会将字符串"a"的位置指定给指针“str”。 (这是非法的!)。

你可以做什么,是分配数组中的值。

char str[100] = {0}; 
str[0]='a'; 
str[1]='b'; 
str[2]='c'; 

printf("%s", str); 
+0

'str'不是一个指针。 – chris

0

如果想初始化一个STR [100],使用此:

char str[100] = "abc"; 

它,只有当我们定义海峡[100]和初始化海峡[100]同时工作!

或者你的代码可以用这种方式工作:

char str[100]; 
str[0] = 'a';  
str[1] = 'b'; 
str[2] = 'c'; 
str[3] = '\0'; 

或者:

char str[100]; 
*str = 'a'; 
++str; 
*str = 'b'; 
++str; 
*str = 'c'; 
++str; 
*str = '\0'; 
0

很多,学习c的时候连我自己,很困惑喜欢你。
其实你必须清楚对char之间`[]`和这个

差分`字符*`

=>char []是一个常量指针是指同一个地址的每一次。但它的值不是恒定的
=>char *是一个非常量的指针,可以改变它来引用任何字符串。它的值也不是恒定的,但是如果它被分配了const char *的地址,那么它的值将是const

来到你的问题

string.h

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    char string[100]; 
    char *str; 

    *str = 'a'; 
    str = str + 1; 
    *str = 'b'; 
    str = str + 1; 
    *str = 'c'; 
    str = str + 1; 

    printf("%s", str - 2); 
    return 0;  
} 
1

使用方法您已经声明数组

char str[100]; 

通过指定数组的名字,你会得到的基址数组与第一个元素的地址相同。

str="a"; 

在上面的语句,你要转让“一个” S(注意“a”是字符串这里)地址阵列的基础。 编译器不会允许你这样做。因为如果你这样做,你将失去所有的100个元素。

如果你想第一个元素与价值分配“一”,然后做

str[0] = 'a'; 

请注意,我用单引号。请记住“单个字符的单引号”

0

一般来说,当你创建一个像这样的字符数组。

char string[100]; //allocate contigious location for 100 characters at compile time 

这里字符串将指向该连续位置的基地址。假设存储器地址从开始那么这将是象

-------------------------------------- 
|4000|4001|4002|4003|...........|4099| 
-------------------------------------- 

可变将指向。要将值存储在4000,您可以执行*(4000)。

在这里,你可以像

*string='a'; //4000 holds 'a' 
*(string+1)='b'; //4001 holds 'b' 
*(string+2)='c'; //4002 holds 'c' 

注:阵列可以通过任何在C三种形式进行访问。

string[0] => 0[string] => *(string+0) => points to first element in string array 
where 
    string[0] => *(4000+0(sizeof(char))) => *(4000) 
    0[string] => *((0*sizeof(char))+4000) => *(4000) 
    *string => *(4000) 

在整数数组的情况下,假设int带有的存储器4字节

int count[100]; //allocate contigious location for 100 integers at compile time 

这里计数将指向contigious位置的基地址。假设从4000的存储器地址开始,然后它会像

-------------------------------------- 
|4000|4004|4008|4012|...........|4396| 
-------------------------------------- 

可变计数将指向。要将值存储在4000,您可以执行*(4000)。

在这里,你可以像

*count=0; //4000 holds 0 
*(count+1)=1; //4004 holds 1 
*(count+2)=2; //4008 holds 2 

所以来你的代码,你的目标可以这样实现。

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    char str[100]; 
    *str='a'; 
    *(str+1)='b'; 
    *(str+2)='c'; 
    printf("%s",str); 
    return 0;  
} 
Output: abc 
0

你坚持使用错误的术语,这导致我相信这就是为什么你找不到答案。

/* 1 */ 
char str[100] = "a"; //OK 

/* 2 */ 
str = "b"; // error: str is an array 

初始化是在声明变量时将值赋给变量时发生的情况。这是上面的源代码摘录1。

赋值是声明变量后发生的事情。您不能分配给结构或数组类型。分配值时,必须在struct/array中处理每个单独的项目。在上面的代码摘录2中,变量str被分配了值“b”,但str是一个数组,因此编译器指出存在错误,因为您无法分配给数组。

摘要: 您可以初始化一个数组,但不能分配给它。区别在于变量在声明时是否被赋予了明确的值。如果是,变量就被初始化了。否则,你试图分配给一个不能完成的数组。