2011-04-02 30 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