C中的Sscanf-从.txt读取数字。文件

问题描述 投票:-1回答:2

我已经编写了一个程序,该程序正在从.txt文件中读取所有数字-工作正常。但是,我只想在程序中使用一个sscanf函数读取所有数字,而不是再次使用isdigit(*poi)sscanf

如果不使用isdigit(*poi),则不会获得数字,该数字将位于.txt文件中一行的开头。

即使没有匹配的字符串,我如何告诉sscanf继续阅读?

代码:

int test(FILE *file, FILE *file2){
    int l = 0;
    int nc = 0;
    char buffer[1000];
    char *poi = NULL;
    fprintf(file2, "\n");
    while(fgets(buffer, 1000, file) != NULL){
        poi = buffer;
        while(*poi){
            if(isdigit(*poi)){
                sscanf(poi, "%d%n",&zahl[l].number, &nc);
                poi += nc;
                fprintf(file2, "%d ", zahl[l].number);
            }
            if(1 == sscanf(poi, "%*[^0-9]%d%n",&zahl[l].number, &nc)){
                poi += nc;
                fprintf(file2, "%d ", zahl[l].number);
            }
            else{
                break;
            }
            l++;

        }
        fprintf(file2, "\n");
    }
    return 0;
}

.txt中的示例文本:

text 2025 text text 25 text text text 1h text
26 text text text text 4,5h.
text text text text 19h

输出应为:

2025 25 1
26 4 5 
19

追加可以:

    if(1 == sscanf(poi, "%*[^0-9]%d%n",&zahl[l].number, &nc)){
            poi += nc;
            fprintf(file2, "%d ", zahl[l].number);
        }

而不是使用:

        if(isdigit(*poi)){
            sscanf(poi, "%d%n",&zahl[l].number, &nc);
            poi += nc;
            fprintf(file2, "%d ", zahl[l].number);
        }
c scanf
2个回答
2
投票

%[^0-9]%n设为单独的sscanf。将nc设置为零,如果此sscanf失败,则将零添加到offsetsscanf为整数,如果失败,则跳出循环。

#include <stdio.h>

int main ( void) {
    char *poi = NULL;
    char *lines[] = {
    "text 2025 text text 25 text text text 1h text"
    , "26 text text text text 4,5h."
    , "text text text text 19h"};
    int value = 0;
    int nc = 0;
    for ( int each = 0; each < 3; ++each) {
        poi = lines[each];
        while ( 1) {
            nc = 0;
            sscanf ( poi, "%*[^0-9]%n", &nc);
            poi += nc;
            if ( 1 == sscanf ( poi, "%d%n", &value, &nc)) {
                printf ( "%d ", value);
                poi += nc;
            }
            else {
                break;
            }
        }
        printf ( "\n");
    }
    return 0;
}

处理-数字。

#include <stdio.h>

int main ( void) {
    char *poi = NULL;
    char *lines[] = {
    "text 2025 text text 25 text text text 1h text"
    , "26 text text text text 4,-5h."
    , "text text text text 19h"};
    int value = 0;
    int nc = 0;
    for ( int each = 0; each < 3; ++each) {
        poi = lines[each];
        while ( 1) {
            nc = 0;
            sscanf ( poi, "%*[^0-9]%n", &nc);
            poi += nc;
            if ( poi > lines[each]) {
                if ( '-' == *(poi - 1)) {
                    --poi;
                }
            }
            if ( 1 == sscanf ( poi, "%d%n", &value, &nc)) {
                printf ( "%d ", value);
                poi += nc;
            }
            else {
                break;
            }
        }
        printf ( "\n");
    }
    return 0;
}

0
投票

我只想在程序中使用一个sscanf函数

使用sscanf()的返回值。如果不是1,则增加poi并在下一个字符处重新扫描。

while(fgets(buffer, 1000, file) != NULL){
  poi = buffer;
  while(*poi){
    int nc = 0; 
    int cnt = sscanf(poi, "%d%n", &zahl[l].number, &nc);
    if (cnt == 1) {
      poi += nc;
      fprintf(file2, "%d ", zahl[l].number);
    } else {
      poi++;
    }
  }
  fprintf(file2, "\n");
}
© www.soinside.com 2019 - 2024. All rights reserved.