以下是Beez C指南 (链接)介绍的%[]
格式说明符:
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)我的程序似乎建议,当否定字符|
为encountered.But时,当它再次为下一个格式说明符启动时,它将停止对%[^|]
说明符的处理,它是否从先前停止的否定字符开始?在我的程序中,我打算忽略|
,因此我使用了测试过的%*c
.But,发现如果我使用%c
和另一个char
类型的参数,那么字符|
确实存储在该参数中。
3) --对我来说至关重要的是,在printf()
中为%s
格式说明符传递字符数组与字符串(以空结尾的字符数组)之间有什么区别?在我的另一个名为character array vs string
的程序中,我为printf()
中的%s
格式说明符传递了一个字符数组(非NULL终止),并将其打印为字符串would.What。
说明%^说明符//的程序
#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);
}
//字符数组与字符串
#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 |
发布于 2013-05-08 20:52:34
如果它不是null终止,那么它将继续打印,直到内存中的某个地方找到一个空字符,这可能会导致数组的结束导致未定义的行为。可以打印非空终止数组:
char buf[] = { 'a', 'b', 'c' };
printf("%.*s", 3, buf);
发布于 2013-05-08 20:55:35
1)这两个格式说明符是否将输入存储在参数(类型char*)中,作为字符数组,还是以\0终止字符(字符串)的字符数组存储?如果不是字符串,如何使其存储为字符串,在下面这样的程序中,我们希望以字符串的形式获取一系列字符,并在遇到特定字符(在被否定的字符集中)时停止?
它们以ASCIIZ格式存储-带有NUL/'\0‘终止符。
2)我的程序似乎建议,当否定符为encountered.But时,对%^x说明符的处理会停止,当它再次为下一个格式说明符启动时,它是否从它早些时候停止的否定字符开始?在我的程序中,我打算忽略我测试过的%*c.But,因此我使用了测试过的%*c.But,发现如果我使用%c和另一个类型char的参数,那么该字符确实存储在该参数中。
它不应该消耗下一个字符。给我们看看你的代码,否则它不会发生;-P。
3)最后,但对我来说至关重要的是,在printf()中传递%s格式说明符的字符数组与字符串(空终止字符数组)之间有什么区别?在我的另一个名为“字符数组与字符串”的程序中,我在printf()中传递了一个字符数组(非空终止)作为%s格式说明符,并将其打印为字符串would.What。
(编辑:以下内容解决了上面的问题,该问题通常讨论数组行为,并且比问题中的代码片段更广泛,该问题专门提出了char[10] = "abcd";
的情况,并且是安全的)
必须向%s
传递指向ASCIIZ文本的指针.即使文本显式地位于char数组中,定义文本内容而不是数组长度的是NUL终止符的强制存在。您必须终止您的字符数组,否则您有未定义的行为。有时,您可能会忘记它--例如,如果-而且只有在有空间的情况下,strncpy到数组中就会终止它,而静态数组从所有-0内容开始--因此,如果您只是在最终字符之前重写,那么您的char10示例碰巧有一些元素,其中的值没有填充空值,但通常您应该负责确保某些内容确保NUL终止。
https://stackoverflow.com/questions/16454559
复制相似问题