首先获取一个包含空格的字符串,然后获取另一个标签

时间:2015-05-21 16:18:00

标签: c regex text

我想从.txt文件中获取字符串,读取每个都有姓名和电话号码的行。姓名和电话号码之间有两个\ t字符。

示例:

name\t\t\tphone#
thomas jefferson\t\t054-892-5882
bill clinton\t\t054-518-6974

代码是这样的;

FILE *f;
errno_t err;
treeNode *tree = NULL, temp;
char input, fileName[100];

//get file name
while (1){
    printf("Enter input file name: ");
    scanf_s("%s", fileName, 100);
    //f = fopen(fileName, "r");
    if(err = fopen_s(&f, fileName, "r"))
        printf("Cannot find file!\n");
    //if (f == NULL)
    //  printf("Cannot find file!\n");
    else
        break;
}

//save info into BST
fscanf_s(f, "  NAME         Phone #\n", 20);
while (fscanf_s(f, "%[^\t]s\t\t%[^\n]s",
    temp.name, temp.phoneNo, 50, 30) != EOF)
    bstInsert(tree, temp.name, temp.phoneNo);
fclose(f);

treeNode是一个二叉搜索树结构,bstInsert是一个将包含第二和第三个参数的结构添加到二叉搜索树的函数。

在我用scanf_s获取文件名后,代码在fscanf_s语句处停止,显示在调试器下面;

temp.name: invalid characters in string.

temp.phoneNo:""

我不知道[^\t][^\n]的确如何运作。任何人都可以让我知道如何处理这个问题?提前谢谢!

1 个答案:

答案 0 :(得分:0)

“任何人都可以让我知道如何处理这个问题?”我不是scanf和家人的粉丝,所以我通过使用不同的方法解决问题。在您使用fopen_sscanf_s后,我使用了strtok strtok_s的“更安全”版本。

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

int main (void) {
    FILE *f;
    errno_t err;
    char *pName, *pPhone;
    char input[100], fileName[100];
    char *next_token = NULL;

    // get file name
    do{
        printf("Enter input file name: ");
        scanf_s("%s", fileName, 100);
        if(err = fopen_s(&f, fileName, "r"))
            printf("Cannot find file!\n");
    } while (err);

    // read and process each line of the file
    while(NULL != fgets(input, 100, f)) {               // has trailing newline
        // isolate name
        pName = strtok_s(input, "\t\r\n", &next_token); // strip newline too
        if (pName == NULL)                              // garbage trap
            pName = "(Error)";
        printf ("%-30s", pName);

        // isolate phone number
        pPhone = strtok_s(NULL, "\t\r\n", &next_token); // arg is NULL after initial call
        if (pPhone == NULL)
            pPhone = "(Error)";
        printf ("%s", pPhone);
        printf ("\n");
    }

    fclose(f);
    return 0;
}

使用包含示例数据的文件编程输出:

Enter input file name: test.txt
name                          phone#
thomas jefferson              054-892-5882
bill clinton                  054-518-6974