2012-09-20 228 views
1

下面打印C程序的16名字的字符串第一个和最后一个字符:在数组中打印字符串打印两个字符?

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

void main() 
{ 
    char first, last; 
    char *str = "abcdefghijklmnop"; 
    first = str[0]; 
    last = str[15]; 
    printf("%s", &first); 
    printf("%s", &last); 
} 

我寻求的输出是A和P。但是,当我运行此代码时,我得到输出:

apa 

我在做什么错?

回答

2

低于线将带来正确的结果

printf("%c", first); 
printf("%c", last); 
+2

我希望OP谨慎接受第一个可行的答案,并继续前进......如果你想成为一名优秀的程序员,你必须了解*为什么*事情按照他们的方式工作。 – mpen

3

你错过了指针的理解。当您将字符分配到firstlast时,那么这些字符将基本上复制到firstlast。由于firstlast是不同的变量,因此它们的地址与指针char *str无关。另外,printf("%s", &first);(和上一个相同)调用未定义的行为,因为printf需要以0结尾的字符串,但只传递一个字符,之后没有零终止符。

你能做的要么是使用指针:

char *first = str + 0; 
char *last = str + 15; 
printf("%s %s", first, last); 

这将打印abcdefghijklmnop p

或仅打印两个字符:

char first = str[0]; 
char last = str[15]; 
printf("%c %c", first, last); 

这将打印a p

1

您的变量firstlast是实际的字符值,而不是字符串/指针。您需要使用%c。尝试:

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

void main() 
{ 
    char first, last; 
    char *str = "abcdefghijklmnop"; 
    first = str[0]; 
    last = str[15]; 
    printf("%c", first); 
    printf("%c", last); 
} 

%s期望得到指向字符值的数组,并保持阅读,直到它到达一个NULL字符\0的指针。

您可以在这里阅读更多关于http://pw1.netcom.com/~tjensen/ptr/ch3x.htmhttp://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output

我发现下面的C++页面有更好的图表可视化指针http://cplusplus.com/doc/tutorial/pointers/