- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是Beez C 指南 (LINK)讲述了 %[]
格式说明符:
It allows you to specify a set of characters to be stored away (likely in an array of chars). Conversion stops when a character that is not in the set is matched.
如果您能澄清由此前提产生的一些基本问题,我将不胜感激:
1) 将这两个格式说明符获取的输入存储在参数(类型 char*
)中作为字符数组还是带有 \0
的字符数组?终止符(字符串)?如果不是字符串,如何将其存储为字符串,例如下面的程序,我们希望将字符序列作为字符串获取并在遇到特定字符(在否定字符集中)时停止?
2) 我的程序似乎建议停止处理 %[^|]
否定字符时的说明符 |
遇到了。但是当它为下一个格式说明符再次启动时,它是否从先前停止的否定字符开始?在我的程序中,我打算忽略 |
因此我使用了%*c
.但是我测试发现如果我使用%c
和一个类型为 char
的附加参数, 然后是字符 |
确实存储在该参数中。
3) 最后但对我来说至关重要的是,为 %s
传递字符数组有什么区别? printf()
中的格式说明符和一个字符串(以 NULL 结尾的字符数组)?在我的另一个名为 character array vs string
的程序中,我已经为 %s
传递了一个字符数组(不是以 NULL 结尾) printf()
中的格式说明符它会像字符串一样打印出来。有什么区别?
//程序说明%[^]说明符
#include<stdio.h>
int main()
{
char *ptr="fruit|apple|lemon",type[10],fruit1[10],fruit2[10];
sscanf(ptr, "%[^|]%*c%[^|]%*c%s", type,fruit1, fruit2);
printf("%s,%s,%s",type,fruit1,fruit2);
}
//字符数组 vs 字符串
#include<stdio.h>
int main()
{
char test[10]={'J','O','N'};
printf("%s",test);
}
输出 JON
//使用%c代替%*c
#include<stdio.h>
int main()
{
char *ptr="fruit|apple|lemon",type[10],fruit1[10],fruit2[10],char_var;
sscanf(ptr, "%[^|]%c%[^|]%*c%s", type,&char_var,fruit1, fruit2);
printf("%s,%s,%s,and the character is %c",type,fruit1,fruit2,char_var);
}
输出 fruit,apple,lemon,and the character is |
最佳答案
它是空终止的。来自 sscanf() :
The conversion specifiers s and [ always store the null terminator in addition to the matched characters. The size of the destination array must be at least one greater than the specified field width.
被排除的字符未被扫描集使用,仍待处理。替代格式说明符:
if (sscanf(ptr, "%9[^|]|%9[^|]|%9s", type,fruit1, fruit2) == 3)
数组实际上是空终止的,因为剩余的元素将被零初始化:
char test[10]={'J','O','N' /*,0,0,0,0,0,0,0*/ };
如果它不是 null 终止的,那么它会一直打印直到在内存中的某处找到一个 null 字符,这可能会超出数组的末尾,从而导致未定义的行为。可以打印非空终止数组:
char buf[] = { 'a', 'b', 'c' };
printf("%.*s", 3, buf);
关于c - scanf()、sscanf() 或 fscanf() 中的 %[] 或 %[^] 说明符是否将输入存储在以 null 结尾的字符数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16454559/
我得到以下声明: // file MadaPacket.h class MadaPacket { // .... public: inline static bool word_is_header
目录 1.语法 2.关键词decltype 1.语法 decltype ( 实体 ) (1) (C++11 起) decltype
由于某些原因,我一直认为演绎指南必须相同noexcept -它们所引用的构造函数的性质。例如: template struct clazz { clazz(const T &) noexcep
我不确定成员 var isMouseOverYard 的正确访问说明符。在代码片段中,我没有从 House 继承的计划。选项 1 与基类更一致(如果我要从任一类继承,我可以检查鼠标是否在对象/院子上)
我可以声明 foo(const T& var) 这样我就知道 var 不会被改变。 指针的等效格式为 foo(const T* var)? 过去我尝试过那些,与 iterator/const_iter
我已经为这个问题搜索了几个小时,但仍然无法解决。 #include using namespace std; enum color { brown, green, orange, red, yell
我有用户定义的数据类型 typedef Unsigned int8 COMMAND_TYPE[6]; 现在我有类似的功能 ConnectCommand(COMMAND_TYPE const comm
说明符 %[^s] 有什么用? s 是一个变量。 在什么情况下我可以使用这个说明符? 最佳答案 scanf 的 %[ 格式说明符将匹配一系列字符,这些字符与 [ 和 ]< 之间列出的字符相匹配。如果第
#include int main() { char a[8]; printf("%d\n",a) ; return 0; } 对于上面的代码,输出是这
很抱歉这个“另一个”sscanf 问题,但我无法通过实验找到任何解决方案。 这是一个字符串,我想解析并提取 2 个由“:”分隔的子字符串: char *str = "tag:R123:P1234";
所以我在维基百科的一篇文章(粗略翻译)中遇到了以下定义: Modifier (programming) - element of source code being a phrase of given
[basic.link]/6 (我的重点): The name of a function declared in block scope and the name of a variable dec
我正在尝试定义我自己的数据类型(称为 sfloat),它类似于 float ,但使用不同数量的尾数位和指数位以更好地适应我的数据范围和精度。目标是定义一种新的数据类型,可以替代现有应用程序中的 flo
请看下面的代码: #include struct A { A(int, int) {} }; struct tag {}; template struct is_noexcept { st
如果这是一个无知的问题,请原谅我,但我仍在思考何时以及如何使用 constexpr 说明符。 (使用 msvc 14 编译)。我正在研究一个简单的基类,它允许您将任意对象包装到“constexpr 对
考虑以下函数: // Declaration in the .h file class MyClass { template void function(T&& x) const; }; /
以下面的示例代码为例: void test(const Item& item = Item()) { ... } 假设一旦 item 被传递给函数,this 就不能抛出。 问题是:函数应该标记为
我听说 noexcept 关键字更像是“它永远不应该抛出异常”而不是“它不会”。 如果我不确定是否抛出异常,我认为使用 noexcept 关键字不是很好,但是 noexcept 关键字有时
最近,我在阅读API of boost::optional 时发现: T const& operator *() const& ; T& operator *() & ; T&&
如果覆盖 ToString在一个类型中 type TestMe ()= override __.ToString() = null 然后我通过 "%A" 输出它说明符 printfn "*%A
我是一名优秀的程序员,十分优秀!