下面的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
我做错了什么?
答案 0 :(得分:3)
你不了解指针。当您将字符分配给first
和last
时,这些字符将基本上复制到first
和last
。由于first
和last
是不同的变量,因此它们的地址与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)
您的变量first
和last
是实际字符值,而不是字符串/指针。您需要使用%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/。