ojb*_*ass 6 c scanf format-specifiers
我遇到了一些代码,并想知道最初的开发人员是做什么的.以下是使用此模式的简化程序:
#include <stdio.h>
int main() {
char title[80] = "mytitle";
char title2[80] = "mayataiatale";
char mystring[80];
/* hugh ? */
sscanf(title,"%[^a]",mystring);
printf("%s\n",mystring); /* Output is "mytitle" */
/* hugh ? */
sscanf(title2,"%[^a]",mystring); /* Output is "m" */
printf("%s\n",mystring);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
字符类的主要原因是%s符号在第一个空白字符处停止,即使您指定字段长度,并且您经常不希望它.在这种情况下,字符类表示法可能非常有用.
考虑这段代码来读取最多10个字符的行,丢弃任何多余的字符,但保留空格:
#include <ctype.h>
#include <stdio.h>
int main(void)
{
char buffer[10+1] = "";
int rc;
while ((rc = scanf("%10[^\n]%*[^\n]", buffer)) >= 0)
{
int c = getchar();
printf("rc = %d\n", rc);
if (rc >= 0)
printf("buffer = <<%s>>\n", buffer);
buffer[0] = '\0';
}
printf("rc = %d\n", rc);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
这实际上是关于comp.lang.c.moderated(大约2004年6月)与getline()变体相关的讨论的示例代码.
至少有一些混乱.第一个格式说明符,%10[^\n]最多可读取10个非换行符,并将它们分配给缓冲区以及尾随空值.第二个格式说明符%*[^\n]包含赋值抑制字符(*),并从输入中读取零个或多个剩余的非换行符.当scanf()函数完成后,输入下一个换行符指出.循环体读取并打印该字符,这样当循环重新开始时,输入正在查看下一行的开头.然后重复该过程.如果该行短于10个字符,则将这些字符复制到缓冲区,并且"零或多个非换行"格式处理零非换行.