数组中的字符串切片打印两个字符?

时间:2012-09-20 06:21:08

标签: c arrays

下面的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

我做错了什么?

3 个答案:

答案 0 :(得分:3)

你不了解指针。当您将字符分配给firstlast时,这些字符将基本上复制到firstlast。由于firstlast是不同的变量,因此它们的地址与char *str指针无关。此外,printf("%s", &first);(与last相同)调用未定义的行为,因为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 :(得分:2)

以下行将带来正确的结果

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

答案 2 :(得分: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.htm和此处http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output了解详情。

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