0

例如,如果我输入“qwer”,这将返回“er”作为输出。如果我只要求 userIn[2],为什么还会输出“r”?

另外,有没有比“char userIn[256]”更脏的替代品?在我看来,256 限制预先确定了用户可以输入的内容,这很糟糕。但我不知道如何使 userIn 没有预定的大小。

char userIn[256];
printf("Type the message to be encoded: ");
scanf("%s", &userIn);
printf("\n");;
printf("This was typed: %s\n", &userIn[2]);
4

3 回答 3

5

你不是在要求userIn[2]. 您要求一个从 开始的字符串&userIn[2]。格式说明符%s的意思是“字符串”。开头的字符串&userIn[2]确实是"er"。这就是您所看到的输出。

如果要打印单个字符,可以使用%c格式说明符并传入userIn[2]而不是&userIn[2]

printf("%c\n", userIn[2]);

或者,您可以使用%s,但在这种情况下,您必须通过精度说明符明确限制要打印的字符串的长度,如

printf("%.1s\n", &userIn[2]);

上面的意思是:打印字符串,但不要输出超过 1 个字符。

PS 正如评论中所指出的,您的scanf电话不正确。它应该是scanf("%s", userIn)or scanf("%s", &userIn[0]),但不是你现在拥有的。您现在拥有的通常会“工作”,但指针的类型仍然不正确。许多编译器会对此发出警告。

于 2013-09-25T15:59:42.560 回答
3

你告诉 printf 打印一个字符串并给它第三个字符的地址。如果你这样做

printf("This was typed: %c\n", userIn[2]);

相反,它只会打印“e”。

于 2013-09-25T16:00:27.087 回答
0

我相信这是因为您使用的是“%s”而不是“%c”。%s 表示以空字符结尾的字符串,其中 %c 是单个字符。在您的情况下使用 %s 会打印“er”,因为这是从您指定的数组位置开始的字符串的其余部分,直到找到空终止字符。

代替

printf("This was typed: %s\n", &userIn[2]);

printf("This was typed: %c\n", &userIn[2]);
于 2013-09-25T16:03:34.540 回答