【问题标题】:How do I separate integers from a string and manipulate them in C?如何从字符串中分离整数并在 C 中操作它们?
【发布时间】:2017-04-30 17:24:28
【问题描述】:

我正在扫描 mm-dd-yyyy 格式的日期,我需要取出三个整数并将它们用于多种用途。如何用 mm dd 和 yyyy 创建三个整数?谢谢!

【问题讨论】:

标签: c string integer


【解决方案1】:

使用来自<stdio.h>sscanf 调用。

char line[80];
int m, d, y;

fgets(fgets(line, sizeof line, stdin);

sscanf(line, "%d-%d-%d", &m, &d, &y);

最好直接使用 fgets+sscanf 而不是 scanf,因为 scanf 有臭名昭著的\n 问题并且不检查缓冲区长度。

【讨论】:

  • 并且不要忽略sscanf()的返回值
  • 它返回的数字比它应该的大得多,并且不允许我输入......它正在返回 m = 3952640 d = 0 y = 4200896 (这是在它甚至允许我输入日期之前. 输入日期时没有任何变化)
  • @xing 这是我的代码 int main() { int x; printf("\n\t\t\t1) 输入日期 (mm/dd/yyyy) 查找过去的天数"); printf("\n\t\t\t2) 输入经过的天数以查找年份中的日期"); printf("\n\n\t\t\t你的选择 (1/2): "); scanf("%d", &x); if(x == 1) { 字符行[80];整数 m, d, y; printf("请输入日期(mm-dd-yyyy):"); fgets(stdin, sizeof line, line); sscanf(line, "%d-%d-%d", &m, &d, &y); printf("\n月: %d\n日: %d\n年: %d", m, d, y);
【解决方案2】:

尝试使用 fgets 进行所有输入。
do/while 循环将继续执行,直到获取有效输入。
这仅验证月份。应该添加一些东西来验证日期和年份。
检查 sscanf 的返回,确保需要的项目已经扫描成功。

#include <stdio.h>

int main(){
    char line[100] = "";
    int scanned = 0;
    int valid = 0;
    int mm = 0;
    int dd = 0;
    int yyyy = 0;

    int x;

    do {
        printf("\n\t\t\t1) Input date (mm/dd/yyyy) to find days passed");
        printf("\n\t\t\t2) Input passed days to find date in the year");
        printf("\n\n\t\t\tYour choice (1/2): ");
        if ( !( fgets ( line, sizeof line, stdin))) {
            fprintf ( stderr, "problem getting input found EOF\n");
            return 1;
        }
        if ( ( scanned = sscanf(line, "%d", &x)) != 1) {
            valid = 0;
        }
        else {
            if ( x == 1 || x == 2) {
                valid = 1;
            }
            else {
                valid = 0;
            }
        }
    } while ( !valid);

    if(x == 1) {
        do {
            printf ( "enter date mm-dd-yyyy\n");
            if ( !( fgets ( line, sizeof line, stdin))) {
                fprintf ( stderr, "problem getting input found EOF\n");
                return 1;
            }
            if ( ( scanned = sscanf ( line, "%d-%d-%d", &mm, &dd, &yyyy)) != 3) {
                valid = 0;
            }
            else {
                valid = 1;
                //validate the values for mm dd and yyyy
                if ( mm < 1 || mm > 12) {
                    printf ( "invalid month try again\n");
                    valid = 0;
                }
            }
        } while ( !valid);
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2018-09-02
    相关资源
    最近更新 更多