【发布时间】:2018-12-06 14:46:30
【问题描述】:
在小组作业中,我们必须读取仅包含(小)字母 a-z 的输入,并且字符的最大长度为 255。我想用 getchar 和 ASCII 检查,但是我的伙伴找到了一个使用 sprintf 和 scanf 的解决方案,但我并不完全理解:
#include <stdio.h>
int main() {
int result = 0;
unsigned int length = 255;
char input[257];
result = readInput(input, &length);
return 1;
}
int readInput(char *output, int *length) {
char format_pattern[15];
sprintf(format_pattern, "%%%u[^\n]%%n", *length);
printf("Max allowed length is %d\n",*length);
scanf(format_pattern, output, length);
printf("Input length is %d\n",*length);
return 1;
}
输出:
Max allowed length is 255
testinput
Input length is 9
sprintf 和 scanf 中的格式模式如何工作?
尤其是u 之前的三个%%% 和n 之前的两个%% - 我尝试将其更改为%u[^\n]%n,因为两个## 会逃脱'%',但后来我得到一个错误,所以他们有在那里。
我唯一想到的是:
-
%n可以读取它前面的字符,例如:int var; printf("Some Text before%n and after",&var); printf("characters before percent n = %d\n", var);输出:
Some Text before and aftercharacters before percent n = 16但在我上面的大示例中,没有指针变量,其中 因为
*length用于%%%u,所以可以存储多少文本? [^\n] 的意思类似于“读到新行”
我在 Google 上搜索了很多,但没有找到类似的例子 - 有人可以帮助我吗?
【问题讨论】:
-
" 字符的最大长度为 255" - 这是什么意思?
char具有固定大小的CHAR_BIT位(通常远小于 255)。还有这是哪种语言,C 还是 C++?为什么用两种不同的语言标记它?如果你的伙伴想出了这个代码,他应该能够解释。 (除非您的合作伙伴的名字是“google”) -
要了解格式字符串,您可以简单地检查
format_pattern中的结果。您可以简单地打印它或在调试器中观察它。在大多数情况下,查看结果有助于了解发生了什么。 -
"但是我的伙伴找到了一个使用 sprintf 和 scanf 的解决方案,我不太明白:" --> 为什么不问问你的伙伴呢?
标签: c printf scanf string-formatting