【问题标题】:How do I monitor valid input with strtok & sscanf如何使用 strtok 和 sscanf 监控有效输入
【发布时间】:2019-11-11 10:45:54
【问题描述】:

我需要输入一个由空格分隔的数字(可能是多个空格)的字符串。

下面我写的代码打印Invalid number只有输入是这种形式:

8a(数字后的字符)。

例如,如果我输入了a b c,它不会打印Invalid number 并继续执行程序。

基本上我需要检查字符串是否包含仅包含数字和空格

如果它没有抛出Invalid number

如果是 - 使用输入的这些数字填充 *numbers 数组。

        printf("Enter numbers:\n");
        fgets (str, sizeof(int)*(size+1)+size*size, stdin);
        token=strtok(str," ");
        for(int i=0; (i<size) && (token!=NULL); i++) {
            if(sscanf(token,"%d%c",&numbers[i],&ch) == 2 && (ch != ' ' && ch != '\n')) {
                printf("Invalid number\n");
                return 0;
            }
            token=strtok(NULL," ");
        }

我尝试按照这种方式实现 strspn 函数:

        printf("Enter numbers:\n");
        fgets (str, sizeof(int)*(size+1)+size*size, stdin);
        int index;
        token=strtok(str," ");
        for(int i=0; (i<size) && (token!=NULL); i++) {
            if(sscanf(token,"%d",&numbers[i])==1){
            index=strspn(token,"0123456789");
            }if (str[index]!='\n'&&str[index]!='\0'){
                printf("Invalid number\n");
                return 0;
            }
            token=strtok(NULL," ");
        }

对于输入:8 8a 8 程序不打印 Invalid number

【问题讨论】:

标签: c


【解决方案1】:

另一种方法是使用%n 说明符遍历字符串。
%n 存储扫描处理的字符数。
str + offset 将扫描字符串中的每个整数。
如果扫描失败,offset 应该是导致问题的字符的索引。

#include <stdio.h>

#define SIZE 20

int main ( void) {
    char str[SIZE * SIZE] = "";//allow SIZE characters for SIZE number of integers
    int numbers[SIZE] = { 0};

    printf("Enter numbers:\n");
    fgets (str, sizeof str, stdin);
    int scanned = 0;
    int offset = 0;
    int i = 0;
    while ( i < SIZE && 1 == sscanf ( str + offset, "%d%n", &numbers[i], &scanned)) {
        i++;
        offset += scanned;
    }

    if ( '\n' != str[offset] && '\0' != str[offset] && ' ' != str[offset]) {
        if ( i < SIZE) {
            printf ( "input problem at: %s\n", str + offset);
        }
    }

    return 0;
}

使用strspn也可以。

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

#define SIZE 20

int main ( void) {
    char str[SIZE * 20] = "";
    int numbers[SIZE] = { 0};

    printf("Enter numbers:\n");
    fgets (str, sizeof str, stdin);
    int index = strspn ( str, "\t\r\n 0123456789");//find a non-matching character
    if ( str[index]) {//found one
        printf ( "good: %.*s\n", index, str);
        printf ( "problem: %s\n", str + index);
    }
    else {//str has only digits and whitespace
        int scanned = 0;
        int offset = 0;
        int i = 0;
        while ( i < SIZE && 1 == sscanf ( str + offset, "%d%n", &numbers[i], &scanned)) {
            printf ( "number[%d]: %d\n", i, numbers[i]);
            i++;
            offset += scanned;
        }
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多