c - 如何在C中的同一行中扫描字符串(带空格)和整数
问题描述
我有一个输入为“SAME AS 1”。这里,“SAME AS”是一个字符串,“1”是整数。如果它们在同一行,我如何将它们都作为输入。
使用 [^\n] 无济于事,因为它还将“1”作为字符串的一部分。使用 [^0-9] 也无济于事,因为相同的 scanf 命令必须将输入作为不以数字结尾的“LEFT”或“RIGHT”。
有没有办法将 [^\n] 和 [^0-9] 结合起来?还有其他方法吗?
PS:无法更改输入。
解决方案
scanf()
不关心换行符
在某种程度上,您可以这样做:
#include <stdio.h>
int main(void)
{
char buffer[64];
int rc;
int number;
while ((rc = scanf("%63[^\n0-9]%d", buffer, &number)) != EOF)
{
if (rc == 0)
{
printf("Nothing read!\n");
int c;
while ((c = getchar()) != EOF && c != '\n')
;
}
else if (rc == 1)
printf("Simple word - no number [[%s]]\n", buffer);
else
printf("Word and number [[%s]] %d\n", buffer, number);
}
return 0;
}
这将捕获并测试scanf()
. 例如,给定数据文件:
SAME AS 1
LEFT
RIGHT
程序如下:
Word and number [[SAME AS ]] 1
Nothing read!
Simple word - no number [[LEFT]]
Simple word - no number [[RIGHT]]
也可以在“单词和数字”报告之后添加“字符吞噬”循环。最好创建一个微功能来做到这一点:
static inline void gobble(void)
{
int c;
while ((c = getchar()) != EOF && c != '\n')
;
}
首先在数据文件中添加一行,其中包含一个数字,如下所示:
SAME AS 1
LEFT
RIGHT
123 ANGELS
你得到:
Word and number [[SAME AS ]] 1
Nothing read!
Simple word - no number [[LEFT]]
Word and number [[RIGHT]] 123
Simple word - no number [[ ANGELS]]
函数族scanf()
几乎不关注换行符或其他空白,除非您强制它们这样做。整个文件也可以在一行上,或者每组非空白都在自己的行上,并且会产生几乎相同的输出。
你确实关心换行符
如果您想要基于行的输入,最好读取行然后解析结果。这还有一个好处,就是您可以更连贯地报告错误。例如:
#include <stdio.h>
int main(void)
{
char line[4096];
while (fgets(line, sizeof(line), stdin) != NULL)
{
char buffer[64];
int number;
int rc = sscanf(line, "%63[^\n0-9]%d", buffer, &number);
if (rc == 0)
printf("Nothing read! (line = [[%s]])\n", line);
else if (rc == 1)
printf("Simple word - no number [[%s]]\n", buffer);
else if (rc == 2)
printf("Word and number [[%s]] %d\n", buffer, number);
else
printf("sscanf() returned %d - can't happen (but did)?\n", rc);
}
return 0;
}
并在第一个文件上运行:
Word and number [[SAME AS ]] 1
Simple word - no number [[LEFT]]
Simple word - no number [[RIGHT]]
和第二个文件:
Word and number [[SAME AS ]] 1
Simple word - no number [[LEFT]]
Simple word - no number [[RIGHT]]
Nothing read! (line = [[123 ANGELS
]])
很难使用任何scanf()
函数族并避免数据的尾随空格SAME AS
- 除非您利用“两个词加数字”或“一个词加数字”或“一个词”,这将需要 '读取行的示例(第二个程序)和多次尝试sscanf()
。
函数族scanf()
非常、非常、非常难以准确使用。很多时候,阅读一行并使用sscanf()
有助于降低复杂性,但即使这样也并不完美。有关该主题的更多想法,请参阅初学者指南。scanf()
推荐阅读
- google-cloud-platform - 使用 terraform 自动创建防火墙规则以及创建 Dataproc 集群
- java - 如何修复此错误:模块“packageName”生产:java.lang.ClassCastExcept
- java - 将可执行文件 (.exe) 嵌入 php
- c# - 如何从 excel 中读取数据并推入 asp.net 中的数组?
- android - 本地化后flutter在启动时显示黑屏
- electron - 无法加载资源:电子中的 net::ERR_FILE_NOT_FOUND
- python - ImageField 的默认图像
- java - 是否有任何排序集不允许添加等于元素并让它们按预定义的比较器排序?
- security - Keycloak 授权 - 最佳实践角色与组
- javascript - 如何使用 JavaScript 一次将内部文本放置到相同的多个 td 中?