如何在c中读取一个文本文件,然后将每一行拆分为标记?

如何在c中读取一个文本文件,然后将每一行拆分为标记?,c,string,pointers,stdin,C,String,Pointers,Stdin,输入文本文件每行有一些数字,数字按空格分割。前两行只有一个数字,后面几行有三个。我想做的是读取每行输入并存储这些数字 到目前为止,我得到的是: int main(int argc, char *argv[]) { int n = 0; char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64 while (fgets(buff,MAX_STRING_LEN, stdin

输入文本文件每行有一些数字,数字按空格分割。前两行只有一个数字,后面几行有三个。我想做的是读取每行输入并存储这些数字

到目前为止,我得到的是:

    int
    main(int argc, char *argv[]) {
        int n = 0;
        char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64
        while (fgets(buff,MAX_STRING_LEN, stdin) != NULL) {
            char temp;
            if (n == 0) {
                sscanf(buff, "%s", &temp);
                int h_num = (int)temp;
            } else if (n == 1) {
                sscanf(buff, "%s", &temp);
                int s_num = (int)temp;
            } else {
                sscanf(buff, "%s", &temp);
                char *token;
                token = strtok(&temp, " ");
                int i = 0;
                int a,b,c;
                while (token != NULL) {
                    if (i == 0) {
                        a = (int)token;
                        token = strtok(NULL, " ");
                    } else if (i == 1) {
                        b = (int)token;
                        token = strtok(NULL, " ");
                    } else {
                        c = (int)token;
                        token = strtok(NULL, " ");
                    }
                    i++;
                }
            }
            n++;
        }
        return 0;
    }
我用来测试代码的print语句如下:

    printf("%d\n",h_num);
    printf("%d\n%d\n%d\n",a,b,c);
我创建了一个如下的文本文件:

23
34
4 76 91
但是输出不是我期望的,我认为是指针的地址。(我又被指针卡住了=()
有人能帮我指出问题所在吗?非常感谢。

在您的代码中,我可以看到

int h_num = (int)temp;

不,这不是将无音字符串转换为
int
的方式

为此,您需要使用

那么

是错误的。
temp
是一个
char
,您必须使用
%c

我建议采取更好的办法:

  • 使用从文件中读取完整的行
  • 使用空格(
    )作为分隔符对输入进行标记化,然后使用将标记(如果不是NULL)转换为
    int
  • 继续,直到返回的令牌为空

  • 在这种情况下,您的代码将更加通用,因为不需要单独考虑每行中存在的
    int
    s的数量。

    为什么不使用
    fscanf(fp、%d、&num)
    ?用正确的格式字符串调用
    fscanf
    三次就足够了。没有循环,没有
    strtok
    ,没有复杂的东西。你的代码有很多问题。
    sscanf(buff,“%s”&temp);
    尝试使用
    a=(int)将字符串扫描成
    char
    令牌;
    etc@CoolGuy似乎
    fscanf
    正在请求一个文件指针,那么我如何使用它来处理每一行?您是否正在重定向来自文件的输入?如果是,请使用
    fscanf(stdin、%d、&num)
    strtol()
    为什么不
    atoi
    ?@Eregrith
    strtol())
    更健壮,可以区分有效的
    0
    输入和错误情况。如果您预见这种扩展将在将来识别更多令牌,则会稍微复杂一些(但健壮得多)解决方案是Flex和Bison。或者类似的Lexer/Parser。Windows版本也可用。@SouravGhosh我试图以这种方式使用
    sscanf
    sscanf(buff,“%d”和&h_num)
    。然后我使用
    printf(“%d”,h_num)
    。但当我编译它时,它说
    h_num
    未声明。这有什么意义?@LeaneLi您在if块中声明过。
    int s_num = (int)temp;
    
    sscanf(buff, "%s", &temp);