2013-07-05 84 views
-3

我想知道为什么第一个代码可以工作,但第二个代码不工作。将字符串赋值给一个变量

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

int main() 
{ 
    char *last, *first, *middle; 
    char pres[20] = "Adams, John Quincy"; 
    char pres_copy[20]; 
    strcpy(pres_copy, pres); 

    last = strtok(pres_copy, ", "); 
    printf("%s", last); 

    first = strtok(NULL, ", "); 
    printf("%s", first); 

    middle = strtok(NULL, ", "); 
    printf("%s", middle); 

} 

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

int main() 
{ 
    char last[20], first[20], middle[20]; 
    char pres[20] = "Adams, John Quincy"; 
    char pres_copy[20]; 
    strcpy(pres_copy, pres); 

    last = strtok(pres_copy, ", "); 
    printf("%s", last); 

    first = strtok(NULL, ", "); 
    printf("%s", first); 

    middle = strtok(NULL, ", "); 
    printf("%s", middle); 

} 

我以为阵列的名字是一样的指针。 但编译器正在作出区分,因为它告诉我类型'char [20]'和类型'char *'是不兼容的。

两种数据类型如何以及为什么不同?

+2

没错。数组有界限,而指针则没有界限。 –

+5

数组不是指针。就这样。 – soon

+1

也检查此链接,http://stackoverflow.com/questions/13667191/lvalue-required-error-when-trying-to-increment-array – VoidPointer

回答

2

数组不是指针。你正试图分配一个指向数组的指针。请参阅this C FAQ有关数组和指针的条目。

0

'char [20]'和类型'char *'不兼容。 char *可以容纳一个指向char的手段,它可以存储地址char不是简单的charchar [20]是一个20个字符(不是字符地址)的数组。

只是使用数组的名称使其指向它的第一个元素。所以将数组名称作为参数传递并不意味着传递整个数组。它只是指向第一个元素的指针。

strtok返回char *,所以期望char *作为赋值的左值。