首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不将%[]或%[^]说明符存储在空终止字符数组中吗?

不将%[]或%[^]说明符存储在空终止字符数组中吗?
EN

Stack Overflow用户
提问于 2013-05-08 20:46:23
回答 2查看 18.1K关注 0票数 5

以下是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。

说明%^说明符//的程序

代码语言:javascript
运行
AI代码解释
复制
#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);
}

//字符数组与字符串

代码语言:javascript
运行
AI代码解释
复制
#include<stdio.h>

int main()
{
char test[10]={'J','O','N'};
printf("%s",test);
}

输出 JON

//使用%c而不是%*c

代码语言:javascript
运行
AI代码解释
复制
#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 |

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 20:52:34

  1. 它是空终止的。在斯堪夫()中,除了匹配的字符外,转换说明符和[始终存储空终止符]。目标数组的大小必须至少比指定的字段宽度大一个。
  2. 排除的字符将被扫描集未使用,并保留待处理。另一个格式说明符: 如果(sscanf(ptr ),“%9^AC.26%9^AC.26%9s”,键入,fruit1,fruit2) == 3)
  3. 该数组实际上为null,因为剩余的元素将为零初始化: char test10={'J','O','N‘/*,0,0,0,0,0,0,0* };

如果它不是null终止,那么它将继续打印,直到内存中的某个地方找到一个空字符,这可能会导致数组的结束导致未定义的行为。可以打印非空终止数组:

代码语言:javascript
运行
AI代码解释
复制
    char buf[] = { 'a', 'b', 'c' };
    printf("%.*s", 3, buf);
票数 6
EN

Stack Overflow用户

发布于 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终止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16454559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文