2013-07-24 98 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是一個數組,因此編譯器指出存在錯誤,因爲您無法分配給數組。

摘要: 您可以初始化一個數組,但不能分配給它。區別在於變量在聲明時是否被賦予了明確的值。如果是,變量就被初始化了。否則,你試圖分配給一個不能完成的數組。