2015-02-26 41 views
0

你好,我有一个学校的作业,使一个程序,发现一个字,并用文本中的另一个替换它。直到现在我还没有完成char字符串,我有一个小问题。我需要扫描文本,查找字和字代替,但只有文字scanf的工作和其他的都只是跳过..scanf三次在c不工作?

char w[10000]; 
char find[10000]; 
char replace[10000]; 
int l,c,b,diff,i,k,yes=0,vm; 
printf("Text: ");scanf("%[^\n]s",w); 
printf("\nFind: ");scanf("%[^\n]s", find); 
printf("\nReplace: ");scanf("%[^\n]s", replace); 

如果你可以说为什么scanf函数用于查找和替换只是跳过我将非常感谢。

对不起,我的母语不好。

+2

需要消耗换行符这是在缓冲器由'scanf的做到这一点( “%[^ \ n]的%* C”,瓦特);' – Gopi

+3

请注意,'[^ \ n]'*是一个转换说明符,它不是's'说明符的修饰符。另外,请检查'scanf()'的返回值。 – unwind

+0

@gopi'scanf(“%[^ \ n]%* c”,w)'扫描_nothing_如果用户只输入''\ n''。'w'仍未初始化,'\ n'仍然保留在'stdin'中,潜在地导致跟随'scanf()'的类似问题。 – chux

回答

1

试一下这个

printf("Text: ");scanf("%[^\n]%*c",w); 
printf("\nFind: ");scanf("%[^\n]%*c", find); 
printf("\nReplace: ");scanf("%[^\n]%*c", replace); 

只需消耗换行符和[^\n]它说

读,直到遇到换行符


我会后摆脱s建议您使用

fgets(w,sizeof(w),stdin); 

哪个更安全。

+0

它的工作原理,谢谢:) –

+0

@BorisMutafov是的,先生,这应该工作:) – Gopi

+0

@BorisMutafov,因为这个答案帮助你,你可以考虑[接受它](http://stackoverflow.com/help/accepted-answer)并检查你的其他问题,看看你是否可以接受一些答案?点击左侧箭头下方的复选标记即可接受答案。接受答案告诉社区该解决方案有效。它也奖励你和那些以某种声誉回答你的问题的人。你没有义务这么做,但这是一个好习惯。 – giusti

0

这应该起作用,因为scanf应该跳过前导空格,包括换行符。

char w[10000]; 
char find[10000]; 
char replace[10000]; 
    /* ... */ 
    printf("Text: ");scanf("%s",w); 
    printf("\nFind: ");scanf("%s", find); 
    printf("\nReplace: ");scanf("%s", replace); 
+0

我更新了我的答案。 – rcgldr

0

scanf("%[^\n]s",w);有多个问题:

  1. 没有必要为s"%[^\n]"是一个完整的格式说明符。 @unwind

  2. 没有输入限制。可以用它来应付极限:char w[10000]; scanf("%9999[^\n]", w);

  3. 格式不消耗任何用户进入输入w保持未初始化,并且'\n'保留在stdin中,以用于接下来的scanf(),其执行相同的操作。在scanf("%[^\n]",w);

    // NOT recommended 
    scanf("%[^\n]%*c", w); This gets stuck on \n only input 
    
  4. 没有消耗典型尾随'\n'。代码可以使用以下内容来检查scanf()的结果。

    if (scanf("%9999[^\n]", w) != 1) Handle_EOForEOLonlyInput(); 
    fgetc(stdin); 
    

推荐代替fgets()

char w[10000]; 
if (fgets(w, sizeof w, stdin) == NULL) Handle_EOForIOError(); 
// strip possible ending EOL if needed. 
w[strcspn(w, "\n")] = 0;