2016年5月21日 星期六

UVA 482 Permutation Arrays (講解sscanf,strtok,讀入一整行未知個數個數字)

/*
    題目連結

    如果有告訴你一行到底有幾個數 這題就很簡單
    先把所有的index 存入陣列p
    再直接照著那些index輸入陣列ans 就行了
    但這題並沒有... 所以比較麻煩些
    
    接下來說明一下如何讀入一整行未知個數個數字

    首先scanf 的使用我在 這一篇 提過了
    sscanf 跟 scanf 很像
    只是前面多了一個參數 char* (也就是字串拉)
    並且以這個字串 作為你後面的變數的輸入

    strtok 有兩個參數 第一個是你給的位置 第二個是你不想要的字元們
    它會回傳一個 從你給定的位置到第一個你不想要的字元的字串
    如果第一個參數為空 則它會從上一次找的位置開始
    如果到了字串的盡頭 它會回傳 NULL

    利用上述的函數
    我們先把 所有index一整行讀起來
    用 strtok來用空白分隔所有數字(但其實還是字串)
    再用 sscanf 把那些字串換成數字
    那這題到此就圓滿解決

    另外這題還有些地方要注意
    首先是每一組測資的輸出間要輸出一個空行
    二來是輸入的小數達十幾位
    所以不能用double要用char array或string來存
*/
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int p[1000001];
char s[1000001], *ptr;
char ans[1000001][21];

int main()
{
    int T;
    scanf("%d", &T);

    for(int Ti = 0; Ti < T; Ti++)
    {
        int n = 0;

        scanf(" %[^\n]", s);
        ptr = strtok(s, " ");

        while( ptr )
        {
            sscanf(ptr, "%d", &p[++n]);
            ptr = strtok(NULL, " ");
        }

        for(int ni = 1; ni <= n; ni++)
            scanf("%s", ans[p[ni] ]);

        if( Ti ) puts("");

        for(int ni = 1; ni <= n; ni++)
            printf("%s\n", ans[ni]);
    }
}

沒有留言:

張貼留言