- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不明白这个扫描集是如何工作的
scanf("%*[^:]%*2c%[^\n]", str1);// 1st scanf
完整代码是
int main()
{
int ch;
char str1[100];
printf("Enter input\n");
scanf("%*[^:]%*2c%[^\n]", str1);
printf("input is: %s",str1);
return 0;
}
如果输入是`
Any combination: You are free to use any combination.
输出是
input is: You are free to use any combination.
当我从 scanf 中删除 %*[^:]
现在 scanf 是 scanf("%*2c%[^\n]", str1);//第二次扫描
具有相同的输入
Any combination: You are free to use any combination.
输出是
input is: y combination: You are free to use any combination.
所以如果我从第一个 scanf 中删除 %*2c
现在 scanf 是 scanf("%*[^:]%[^\n]", str1);\\第三次扫描
输入是
Any combination: You are free to use any combination.
输出是
input is: : You are free to use any combination.
Agian 如果我从第一个 scanf 中删除 %[^\n]
。
现在 scanf 是 scanf("%*[^:]%*2c", str1);\\第四次扫描
输入是
Any combination: You are free to use any combination.
输出是
garbage value.
问题是每个 scanf 中的 scanset 如何工作?请逐步解释。
最佳答案
查看 https://en.cppreference.com/w/c/io/fscanf 上的 scanf
文档:
conversion specifications. Each conversion specification has the following format:
introductory % character
(optional) assignment-suppressing character *. If this option is present, the function does not assign the result of the conversion to any receiving argument.
(optional) integer number (greater than zero) that specifies maximum field width, that is, the maximum number of characters that the function is allowed to consume when doing the conversion specified by the current conversion specification.
...
[set]
- matches a non-empty sequence of character from set of characters. If the first character of the set is ^, then all characters not in the set are matched...
所以分解你的格式字符串:
%*[^:]
- 将所有内容匹配到 :
,但不要分配给变量。基本上忽略冒号前的所有内容。
%*2c
- 匹配 2 个字符但同样不分配它们。所以跳过冒号和后面的字符。
%[^\n]
- 匹配直到 \n
(新行字符)的所有内容,这将分配给 str1
。因此,第一个冒号和后续字符之后的所有内容都会在此处进行匹配和分配。
因此对于输入Any combination: You are free to use any combination.
,忽略的部分是Any combination:
,结果在str1
是您可以自由使用任何组合。
scanf("%*[^:]%*2c", str1)
导致打印垃圾的原因是因为两个格式说明符都没有分配 str1
使其未初始化。恰好在 str1
数组的内存中的字节值被打印出来,因此是无稽之谈。在这种情况下,scanf
(或 printf
)样式函数有未使用的参数,大多数现代编译器都应发出警告。因此,请确保您已打开警告,并尝试解释和修复它们。
如果输入不包含 :
,您的完整格式字符串也会发生同样的事情,在这种情况下,scanf
永远不会到达分配 的部分>str1
并且您的结果将再次成为垃圾。要解决这个问题,您需要查看 scanf
的返回值:
Return value
Number of receiving arguments successfully assigned (which may be zero in case a matching failure occurred before the first receiving argument was assigned), or EOF if input failure occurs before the first receiving argument was assigned.
在这种情况下,您将得到 EOF
,因为输入将在分配 str1
之前结束。为确保 str1
有效,您需要检查返回值是否为 1
。
最后,正如评论中提到的,这里还有一个问题,如果用户在跳过的部分之后输入大于 str1
数组可以容纳的部分。请注意,scanf
会自动在字符串的末尾添加终止符 \0
,因此输入的指定部分的最大长度为 99 个字符。如果输入较大,它将离开缓冲区的末尾并覆盖它不应该覆盖的内存。这很可能会导致程序行为异常或崩溃。通过向转换说明符添加最大字段宽度说明符,可以使格式字符串安全。简而言之,将 %[^\n]
更改为 %99[^\n]
。
关于c - 不理解 scanf 中的 Scanset 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58258602/
我的运动需要一些帮助。 Question of exercise 这是我的代码: #include main() { int price,new_price; char code; printf(
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 5 年前。 我有这段代码(由于逻辑是家庭作业
我这里有一段代码,在输入带空格的字符串时会出现一些不需要的行为。例如 print illegal_argument。当输入包含多个单词时,我希望它只注册第一个单词。 目前发生的是: christian
我的测试输入是 [1,2,3] [4,5,6] [7,8,9] [9,9] 或者它可以是单个 2d 坐标之前的任意数量的 3d 坐标,我的代码是 #include #include #includ
这个问题在这里已经有了答案: What does space in scanf mean? [duplicate] (6 个答案) 关闭 7 年前。 像这样在scanf中加一个空格的目的是什么 sc
#include int main() { int n; scanf("%d", &n); printf(n); return 0; } 这是我的代码,我很愚蠢,可能
程序要求用户输入 2 名学生的姓名、ID 等,将数据写入文件并从文件中读回数据。 #include #include #include #include #include int main(
这个问题在这里已经有了答案: abnormal behavior of scanf [duplicate] (3 个答案) 关闭 8 年前。 今天我遇到了一个问题,当我使用两次接受字符作为输入的 s
我正在用 c 编写一个程序来读取文件的内容。代码如下: #include void main() { char line[90]; while(scanf("%79[^\
main() { int d,a; printf("Enter the digit :"); scanf("%d",&d); printf("Enter another
为什么为 scanf 输入添加多个句点会跳过下一个 scanf 函数。示例输入:b. b. int main (void) { char b[7] = " "; printf("Thi
我想我已经尝试过任何方法(刷新 stdin、scanf 以使用换行符等),但没有任何效果如我所希望的那样。由于某种原因,第三个 scanf 在以下代码中修改了第二个 scanf 中的变量: #incl
这个问题在这里已经有了答案: Scanf skips every other while loop in C (10 个答案) 关闭 6 年前。 我想做一个计算器,只是一个带有循环和基本操作的简单计
如果没有初始化 ("mod=0") ,这段代码进入死循环。我不明白为什么这段代码会循环,即使我使用了 getchar();删除缓冲区。当我先输入“1”,然后再输入“a”时,就会出现无限循环。谁能帮助我
当我为 scanf() 输入一个值时 它只是跳过紧随其后的第二个、第三个和任何其他 scanf()。 这是我的代码: #define _CRT_SECURE_NO_WARNINGS #include
#include #include void sstring(); int main() { char ch1[10],ch2; printf("Ent
这是一个计算房间内人员年龄的简单程序。我正处于初始阶段,现在我看到我不知道哪些变量(我的意思是我在 scanf 之前声明的变量,然后是 scanf 中的占位符)用于 scanf;如何选择和应用正确的变
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 5 年前。 我知道 scanf() 的用法,
我已经阅读了扫描集的行为。通过研究和测试,我遇到了一个问题。 难道 scanf("%[^\n]") 的行为与 scanf("%s") 一样吗? scanf("%s") 正在消耗字符,直到在 stdin
我遇到了一个问题,当我使用 scanf 将字符串存储到 char 指针中时,我有 3 个输入 - 姓名、姓氏和年龄,姓氏的最后一个 char 值被替换为年龄输出以更好地解释。 Q-riosity v0
我是一名优秀的程序员,十分优秀!