2011-04-02 28 views
0

嘿傢伙!我是C新手,所以我想在一個問題上提供幫助。我必須分開一個字符串並將其放入不同的變量中。試想一下,Sol 3 5會導致類似:將字符串拆分成不同的變量

var1=Sol 
var2=3 
var3=5 

我試圖用scanf函數,但它在第一空間採空:/。
在此先感謝!
乾杯!

編輯:是不是我的功課,我只是練習,但我真的想現在我怎麼能做到這一點:)。我現在的代碼是這樣的:

int main() { 
    char var1[10],var2[10],var3[10],func; 
    fgets(func, 20, stdin); 
    fscanf(func,"%s %d %d", var1,var2,var3); 
    printf("%s %d %d", var1,var2,var3); 
    return 0; 
} 
+3

請發表您到目前爲止的代碼。 – Mat 2011-04-02 17:06:41

+3

這是功課嗎?沒問題,如果是......請讓我們知道,我們將回答這一點。 – pmg 2011-04-02 17:09:45

+0

是不是我的功課,只是練習:)。我把我現在的代碼放在這個話題上,以表達我想要做的事。 – danielpm 2011-04-02 17:32:30

回答

3

編輯後和代碼發佈

你的問題是,你是騙來的編譯器。不要這樣做。它不喜歡它:)

你問的編譯器讀取一個字符串和2個整數...但隨後告訴它把結果在一個字符數組(正確的只有第一個轉換)

   /* char[] but %d wants pointer to int */ 
    fscanf(func,"%s %d %d", var1,var2,var3); 
         /* all var1, var2, and var3 are arrays of char! */ 

嘗試聲明的變量作爲

char var1[10]; 
    int var2,var3; 

哦! func被聲明爲普通字符。你可能想要別的東西。

一旦你聲明瞭這樣的變量,你需要改變scanf調用int的地址,而不是它們的(未初始化的)值。

+0

謝謝!幫了很多!你是一位很好的老師:D – danielpm 2011-04-02 17:54:06

+0

還有一件**重要的事情:你應該總是測試大多數標準C函數的返回值;特別是'scanf'系列(也是'malloc'系列)。所以...寫下if(scanf(...)!= 3){/ * oops * /}'而不是'scanf(...);' – pmg 2011-04-02 18:15:06

3

strtok是你需要的功能:

#include <string.h> 

char* str = "Sol 3 5"; 
char* ptr; 
char* saved; 
ptr = strtok_r(str, " ", &saved); 
while (ptr != NULL) 
{ 
    printf("%s\n", ptr); 
    p = strtok_r(NULL, " ", &saved); 
} 

剛一說明:此函數修改原始字符串,將字符串標記的結束(空,\0)代替分隔符。

scanf將是一件好事,無論如何,但我不會幫助你,如果你沒有明確規定,如果是家庭作業..

+2

新代碼不應該使用'strtok'。改爲使用'strtok_r',它的功能大致相同,但是線程安全。 – 2011-04-02 17:11:33

+0

是的,對不起,忘了重入:) – Jack 2011-04-02 17:12:22

+0

@Jack:'srttok'和'strtok_r'有不同的參數列表; @John:'strtok_r'是POSIX,所以不是普遍的(在C編譯器中)。 – pmg 2011-04-02 17:25:54

0

有一個叫sscanf類似scanf功能。它的工作原理都是一樣的,但它從一個字符串,而不是從文件中讀取到的值:

sscanf("Sol 3 5", "%s%d%d", v1, &v2, &v3); 
+0

不錯的提示,我現在使用它:)。非常感謝! – danielpm 2011-04-02 17:54:38

+0

@pmg:杜,現在修復。 – hugomg 2011-04-02 18:04:14