2013-10-10 71 views
-2

我需要分割一個字符串並需要存儲兩個獨立的變量。該字符串包含一個選項卡空間。因此需要從標籤空間在C編程中分割字符串

EG分隔:字符串看起來像這樣

Sony <TAB>   A Hindi channel. 

我需要存儲Sony在一個變量說char a[6];A Hindi Channel在另一個變量說char b[20];

如何可以做到這一點?

+2

這是C++或C?請做出決定。 –

+1

您是否需要保留製表符,即'foo \ tbar'應該在'foo \ t'和'bar'還是'foo'和'bar'中?如果有兩個後續的分隔符,例如'FOO \噸\ tbar'。 –

+1

檢查strtok的手冊頁 – mousomer

回答

0

我的C是舊的,但這樣的事情應該工作:

#include <stdio.h> 


int getTabPosition (char str []) 
{ 
    int i = 0; 
    //While we didn t get out of the string 
    while (i < strlen(str)) 
    { 
     //Check if we get TAB 
     if (str[i] == '\t') 
      //return it s position 
      return i; 
     i = i + 1; 
    } 
    //If we get out of the string, return the error 
    return -1; 
} 

int main() { 
    int n = 0; 
    //Source 
    char str [50] = ""; 
    //First string of the output 
    char out1 [50] = ""; 
    //Second string of the output 
    char out2 [50] = ""; 

    scanf(str, "%s"); 
    n = getTabPosition(str); 
    if (n == -1) 
     return -1; 
    //Copy the first part of the string 
    strncpy(str, out1, n); 
    //Copy from the end of out1 in str to the end of str 
    //str[n + 1] to skip the tab 
    memcpy(str[n+1], out2, strlen(str) - n); 
    fprintf(stdout, "Original: %s\nout1=%s\nout2=%s", str, out1, out2); 
    return 0; 
} 

未經檢驗的,但普林西有

+1

在'while'循環的每次迭代中計算'strlen(str)'是不值得的,它可以簡單地爲'while(str [i]!=(char)0)' –

+0

@BasileStarynkevitch:我沒有想到,我用你的代碼編輯過。感謝您的提醒。 – DrakaSAN

1

記號化字符串的很多編程語言:link

你的情況< tab>是一個特殊字符,它可以是表示爲'\ t'。

如果您正在使用C語言編程

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

int main(void) { 
    char *a[5]; 
    const char *s="Sony\tA Hindi channel."; 
    int n=0, nn; 

    char *ds=strdup(s); 

    a[n]=strtok(ds, "\t"); 
    while(a[n] && n<4) a[++n]=strtok(NULL, "\t"); 

    // a[n] holds each token separated with tab 

    free(ds); 

    return 0; 
} 

對於C++而無需使用升壓庫:

#include <string> 
#include <sstream> 
#include <vector> 
#include <iterator> 
#include <iostream> 
#include <algorithm> 

int main() { 
    std::string s = "Sony\tA Hindi channel."; 
    std::vector<std::string> v; 
    std::istringstream buf(s); 
    for(std::string token; getline(buf, token, '\t');) 
     v.push_back(token); 
    // elements of v vector holds each token 
} 

使用C++和提升:How to tokenize a string in C++

#include <iostream> 
#include <string> 
#include <boost/foreach.hpp> 
#include <boost/tokenizer.hpp> 

using namespace std; 
using namespace boost; 

int main(int, char**) { 
    string text = "Sony\tA Hindi channel."; 

    char_separator<char> sep("\t"); 
    tokenizer< char_separator<char> > tokens(text, sep); 
    BOOST_FOREACH (const string& t, tokens) { 
     cout << t << "." << endl; 
    } 
}