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

我究竟做错了什么?

4

3 回答 3

3

您缺少对指针的理解。当您将字符分配给firstandlast时,这些字符实际上将被复制到firstand last。由于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.

于 2012-09-20T06:24:13.500 回答
2

下面的行将带来正确的结果

printf("%c", first );
printf("%c", last );
于 2012-09-20T06:23:23.220 回答
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 -输出

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

于 2012-09-20T06:24:19.863 回答