如何使用scanf读取由/分隔的字符串 [英] How to read string separated by / with scanf

查看:233
本文介绍了如何使用scanf读取由/分隔的字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经尝试了很长时间了,经过一番研究我没有成功,所以我最后的办法是问一个问题.我的输入看起来像这样:

I`ve been trying to this for quite a while now and after some research I had no success, so my last resort was asking a question. My input looks like this:

1.0.0.0/255.0.0.0/127.0.0.1/1112 
1.2.0.0/255.255.0.0/2.4.6.9/1112
1.2.3.0/255.255.255.0/1.2.3.1/111

我需要从每一行中提取4个字符串,例如,第一行会给我

I need to extract 4 strings from each line, so for exemple the first line would give me

s1 = 1.0.0.0
s2 = 255.0.0.0
s3 = 127.0.0.1
s4 = 1112

这是我尝试过的:

scanf("%s/%s/%s/%s", str1, str2, str3, str4); // This doesn't consume the "/"
scanf("%[^/]s%[^/]s%[^/]s%[^/]s", str1, str2, str3, str4); // This only gets the first string
scanf(""%[^\n]s%*c%s%*c%s%*c%s", str1, str2, str3, str4); // Hera %*c was supposed to consume the "/" and do not store it, it doen't happen tho

如何在while (!feof(fileIn))内使用单个scanf从每条输入行中获取4个字符串?谢谢.

How can I get the 4 strings from each input line using a single scanf inside a while (!feof(fileIn)) ? Thank you.

推荐答案

发布的代码存在一些问题. scanset指令为%[];在此没有s.使用%[^/]s的格式字符串正在尝试匹配输入中的文字s.但这将始终失败,因为%[^/]匹配除/之外的任何字符.遇到/时,匹配失败,并且/字符保留在输入流中.在继续下一个输入字段之前必须消耗此字符.

There are a few issues with the posted code. The scanset directive is %[]; there is no s in this. The format strings using %[^/]s are attempting to match a literal s in the input. But this will always fail because %[^/] matches any character except for /. When a / is encountered, the match fails and the / character is left in the input stream. It is this character which must be consumed before continuing on to the next input field.

此外,请注意,while(!feof(file)){}始终是错误的.相反,请尝试使用fgets()按行提取输入,并使用sscanf()进行解析.到达文件末尾时,fgets()函数将返回空指针.

Also, note that while(!feof(file)){} is always wrong. Instead, try fetching input by lines using fgets(), and parsing with sscanf(). The fgets() function returns a null pointer when end-of-file is reached.

此外,在使用scanf()系列函数读取字符串时,应始终指定最大宽度,以避免缓冲区溢出.

Further, you should always specify a maximum width when reading strings with scanf() family functions to avoid buffer overflow.

这是一个示例程序:

#include <stdio.h>

int main(void)
{
    char input[4096];
    char str1[100];
    char str2[100];
    char str3[100];
    char str4[100];

    while (fgets(input, sizeof input, stdin)) {
        sscanf(input, " %99[^/]/ %99[^/]/ %99[^/]/ %99[^/]",
               str1, str2, str3, str4);

        puts(str1);
        puts(str2);
        puts(str3);
        puts(str4);
    }

    return 0;
}

使用来自问题的样本输入进行样本交互:

Sample interaction using sample input from the question:

λ> ./a.out < readstring_test.txt 
1.0.0.0
255.0.0.0
127.0.0.1
1112 

1.2.0.0
255.255.0.0
2.4.6.9
1112

1.2.3.0
255.255.255.0
1.2.3.1
111

这篇关于如何使用scanf读取由/分隔的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆