2016-06-30 80 views
1

我试图给出以下形式的程序输入:如何让scanf忽略来自输入文件的无关文本?

11 22 @3 
30 2 @^ 
1 4 @B asdfghj 

但是,有几行(像上次)是对他们有额外的文本。我试图让程序忽略它们无济于事。

下面是我当前的代码:

int x_coord; 
int y_coord; 
char type[3]; 

do(grid[y_coord][x_coord]=type[1]); 
while(scanf("%d %d %s",&x_coord,&y_coord,type)!=EOF);{ 
for(i=1; i<=30;i++){ 

for(j=1; j<=30;j++){ 
    printf("%c",grid[i][j]); 
} 
    printf("\n"); 
} 
} 

我试图添加一个额外的参数%*s到SCANF试图捕捉任何多余的文字,但我无法得到它的运行。

有没有人有任何建议如何处理输入文件中的额外文本?

+2

用'fgets'阅读每行,然后使用'sscanf'。 –

+1

http://ideone.com/Wjl2Nl – BLUEPIXY

回答

1

你的循环看起来很奇怪。

do(grid[y_coord][x_coord]=type[1]); 
while(scanf("%d %d %s",&x_coord,&y_coord,type)!=EOF); 

y_coordx_coordtype正确初始化的分配工作?

此外,scanf()将返回成功扫描的元素数量。您可以将其用于其他错误检查。

在任何情况下,如果是国内形成自己的输入,那么你可以使用以下格式的字符串:

scanf("%d %d %s%*[^\n]%*c",&x_coord,&y_coord,type) 

解析前三个参数后,这将放弃任何不是一个换行符,然后丢弃换行符本身。

使用scanf()容易出错,因为形成不良的输入会导致扫描堵塞或意外错误,因为输入的意外部分会被错误解释。对于行分隔的输入,最好先用fgets()先读取整行,然后用sscanf()解析该行。

+0

啊,我真的很接近这个,只是错过了最后一个'%* c'。我是编程新手,所以我找到了一个可以工作并使用它的循环。是否有另一个循环会更好一点? –

+1

赋值语句周围的括号具有误导性。它看起来像你认为'do'后面跟着一个谓词检查,事实上,括号声明是do-while循环的主体。使用常规while循环会更清楚(也许更正确),并让赋值成为while循环的主体。 – jxh