2011-05-12 67 views
2

说我需要在两个名称 一样,[name name]\n读....(可能 更多[name name]\n。假设名称 可以有19个长度,到目前为止我的代码 是,我怎么居然会防止输入像我的情况[name name name]\n以上[name name name...]\n?我听说过与fgets()和的fscanf,但会有人好心告诉我一个例子,如何提前使用它们?谢谢。scanf函数来FGETSç

char name1[20]; 
char name2[20]; 
for(int i=0; i < numberOfRow ; i++){ 
    scanf(" %s %s", name1, name2); 
} 

行,所以我找到了一种方法以确保只有两个元素,但我不知道如何将它们放回变量...

char str[50]; 
int i; 
int count = 0; 
fgets(str, 50, stdin); 

i = strlen(str)-1; 
for(int x=0; x < i ;x++){ 
    if(isspace(str[x])) 
    count++; 
} 
if(counter > 1){ 
    printf("Error: More than 2 elements.\n"); 
}else if{ 
//How do i place those two element back into the variable ? 
char name1[20]; 
char name2[20]; 

}

+1

有未定义行为的可能性,如果输入的字符串超过20个字符。改用'%20s%20s'。 – 2011-05-12 11:23:14

+0

您需要考虑空终止符** NOT **正在由'scanf'格式字符串中的'width'说明符计算。一个有20个字符的数组应该有一个对应的'“%19s”'(或''%19 [“')格式的字符串。 – pmg 2011-05-12 11:44:45

回答

0

你可以使用strtok(string.h)。请注意,这个函数会修改你的源字符串(你可以先复制字符串)。

举例的strtok:

char* word; 

// First word: 
word = strtok(str, " "); // space as the delimiter 
strncpy(name1, word, sizeof(name1) - 1); 
name1[sizeof(name1) - 1] = 0; // end of word, in case the word size is > sizeof(name1)  

// Second word 
word = strtok (NULL, " "); 
strncpy(name2, word, sizeof(name2) - 1); 
name2[sizeof(name2) - 1] = 0; 

另外,我觉得你应该CHEC

0

如果从标准输入去,也没有停止这一点,用户可以输入他们喜欢什么方式。最好首先读入所有输入,然后检查然后结果。

+0

我可以阅读整行,然后检查是否只有两个名字? – Jono 2011-05-12 11:35:15

+0

取决于,基本上,您需要检查输入以查看所得结果。你可以拥有该字符串中的各种字符,包括数字,特殊字符等。如果这是你的意思,我不会推荐在输入上使用sscanf。 – ColWhi 2011-05-12 12:51:11

+0

到目前为止,我使用fgets,得到了整个行,​​并使用isspace来确定是否有超过1个空白......是吗? – Jono 2011-05-12 13:00:08

0

您可以使用fgets来读取所有行,然后解析结果。 例如:

char name[256]; 
for (int i = 0; i < numberOfRow; i++) 
{ 
    if (fgets(name, 256, stdin) != NULL) 
    { 
     // Parse string 
    } 
} 

与fgets读取的行,被按压直到输入。 现在你需要解析这个字符串,如果用户输入错误的输入(如“aaa”或“aaa bbb ccc”)返回错误,else(“aaa bbb”),分割字符串并使用“aaa”作为name1和“bbb “as name2

+0

fgets是从文件而不是键盘读取。 – Amir 2011-05-12 11:52:05

+0

如果我们提供了像test00.in test00.out这样的测试用例文件,该怎么办。在这种情况下,fgets是否合适? – Jono 2011-05-12 11:54:23

+0

是的。另外,pmg是正确的,你可以使用控制台作为文件。参见wiki中的示例:http://en.wikipedia.org/wiki/Fgets – Amir 2011-05-12 12:01:34