【问题标题】:sscanf ignoring spaces in Csscanf忽略C中的空格
【发布时间】:2018-12-29 09:22:03
【问题描述】:
char s[20] = "test1 16 test2";
char a[20]; char b[20];
sscanf(s, "%s%*d%s", a, b);
printf("'%s' '%s'", a, b); //'test1' 'test2'

sscanf 是否已预编程以忽略空格?
我期待:

'test1 ' ' test2'.

【问题讨论】:

  • “直到第一个空白字符”这意味着我猜是排除在外。谢谢。
  • 是的,%c%[] 除外。
  • 没有办法读取空格?
  • 哦,通过添加 %c
  • 是否可以直接从 sscanf 将空格包含在字符串中?

标签: c string scanf


【解决方案1】:

要在扫描的字符串中包含空格,%n 说明符,用于捕获扫描处理的字符数,可能是更好的选择。 "%s %n 将记录第一个单词和尾随空格处理的字符数。 %*d%n 将扫描并丢弃该整数,并将处理的字符总数记录到整数末尾。然后%s%n会跳过空格,扫描最后一个单词,记录处理的字符总数。
使用strncpy 复制单词和空格。

#include <stdio.h>
#include <string.h>

#define SIZE 19
//so SIZE can be part of sscanf Format String
#define FS_(x) #x
#define FS(x) FS_(x)


int main ( void) {
    char s[SIZE + 1] = "test1 16 test2";
    char a[SIZE + 1]; char b[SIZE + 1];
    int before = 0;
    int after = 0;
    int stop = 0;
    if ( 2 == sscanf(s, "%"FS(SIZE)"s %n%*d%n%"FS(SIZE)"s%n", a, &before, &after, b, &stop)) {
        if ( before <= SIZE) {
            strncpy ( a, s, before);//copy before number of characters
            a[before] = 0;//terminate
        }
        if ( stop - after <= SIZE) {
            strncpy ( b, &s[after], stop - after);//from index after, copy stop-after characters
            b[stop - after] = 0;//terminate
        }
        printf("'%s' '%s'\n", a, b);
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2023-03-17
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2015-03-31
    相关资源
    最近更新 更多