2013-12-12 62 views
0

新蜂C.这是我的代码(它从一个字符串替换字符):scanf函数,没有开关的情况下执行

#include <stdio.h> 
#include <string.h> 
#include <conio.h> 

void main() 
{ 
    char str[100], r, ra; 
    printf("enter string"); 
    gets(str); 
    int length; 
    length= strlen(str); 
    printf("length of string is %d",length); 
    printf("\nenter the the character that will replace"); 
    scanf("%c",&r); 
    printf("where to replace\n b...begning\ne....ending\np....position"); 
    scanf("%c",&ra); 
    int pos; 
    switch(ra) 
    { 
    case 'b' : str[1]=r; break; 
    case 'e' : str[length-1] = r; break; 
    case 'p' : printf("enter position"); 
       scanf("%d",pos); 
       if(pos<1 || pos>length-1) 
        printf("please enter a position between 1 and %d",length-1); 
       else 
        str[pos]= r; 
       break; 
    } 
    printf("\n after replacing string is %s", str); 
    getche(); 

} 

的问题是,IDE不编译这部分程序,我知道我正在做一些错误的事情,但无法弄清楚什么?需要帮助。

scanf("%c",&ra); 
    int pos; 
    switch(ra) 
    { 
    case 'b' : str[1]=r; break; 
    case 'e' : str[length-1] = r; break; 
    case 'p' : printf("enter position"); 
       scanf("%d",pos); 
       if(pos<1 || pos>length-1) 
        printf("please enter a position between 1 and %d",length-1); 
       else 
        str[pos]= r; 
       break; 
    } 
+2

“IDE不编译这部分程序”:你是什么意思?它给出了一个错误消息?还有别的吗?请与我们分享。 –

+1

我猜你正在使用Visual Studio,是否正确?不要使用'gets()',这很危险。改用'fgets()'。 –

+1

怀疑编译器“不编译”你的程序的一部分不是很有效率。这当然不是你所观察到的。您发现程序不会执行您编程的任何情况。有一个简单的方法可以知道执行的地方,在那里:添加一个'default'事件,并在那个时候打印出'ra'中的内容。 –

回答

3

使用scanf(" %c",&ra) insted "%c"。因为与"%c"一起阅读给你一个垃圾值ra。并且该值为新行。

当您在a中输入值时,按下类似p然后Enter key。此Enter key仍保留在stdin流中。

当您在ra中读取下一次的时候,stdin中的Enter key流将返回ra

因此,要删除该Enter key你需要阅读像" %c"

+0

是的,但OP的问题是程序还没有编译。他可以在编译和运行后遇到这个问题。 –

2

scanf(" %c", &ra); //%c之前的空间
与大多数转换不同,%c在转换字符之前不会跳过空格。用户输入号码后,输入缓冲区中会有一个回车/换行符等待读取 - 这就是%c读取的内容。SO POST

而出于同样的原因,您的开关盒不是工作,因为ra没有预期的价值

0

该程序不编译,最可能的原因是,您使用的编译器只支持C89(我猜是Visual Studio),或者您正在使用C89模式。

在此代码:

scanf("%c",&ra); 
int pos; 
switch(ra) 
{ 

可变pos在方框,这仅因为C99被支撑的中间定义。解决的办法是将所有定义到一个块的开头:

int main() 
{ 
    char str[100], r, ra; 
    int pos; 
    printf("enter string"); 

使用fgets()更换gets(),使用int main更换void main。并使用其他答案涵盖的scanf修复问题。

1

的问题是IDE未编译程序

嗯,这是一个强烈指责这一部分。与其假设编译器确实不会编译部分代码(一时兴起),更确切的说,您的程序的执行流程并不像您期望的那样进入该部分。

特别是,scanf不像您认为的那样行事。它从stdin中读取,这是一个缓冲输入流。 “缓冲”意味着它不会为你的程序提供输入,直到读入新行,即直到用户按下返回。但scanf系列函数不寻找新行,它将新行字符视为普通字符。在你的情况下,扫描"%c"尝试从输入中读取任何字符。随后"%c"然后读取新行,因此您的switch语句中的&ra确实是'\n'

我通常会发现C语言的用户很难直接输入,但是如果您必须以交互方式提示用户,我建议您首先用fgets读入一整行输入,然后用sscanf分析该行。这可以摆脱看起来不同步的输入,并且还可以让您多次扫描一条线,也许可以用于替代输入语法。

所以,这里是一个使用这种技术代码的版本:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[100], r, ra; 
    char line[20]; 
    int length; 
    int pos; 

    printf("enter string"); 
    fgets(str, 100, stdin); // note: str includes trailing newline 

    length = strlen(str); 

    printf("length of string is %d\n", length); 
    printf("enter the the character that will replace:\n"); 
    fgets(line, 20, stdin); 
    sscanf(line, " %c ",&r); 

    printf("where to replace\n"); 
    printf("b...begning\ne....ending\np....position\n"); 
    fgets(line, 20, stdin); 
    sscanf(line, " %c ", &ra); 

    switch (ra) 
    { 
    case 'b': str[1] = r; 
       break; 

    case 'e': str[length - 1] = r; 
       break; 

    case 'p': printf("enter position"); 
       fgets(line, 20, stdin); 
       sscanf(line, "%d ", &pos); 

       if(pos < 1 || pos > length-1) 
        printf("please enter a position between 1 and %d", 
         length-1); 
       else 
        str[pos]= r; break; 
    } 

    printf("after replacing string is %s", str); 

    return 0; 
} 

还有你的代码的问题,主要与C.从零开始的数组索引做我让你来把这些弄清楚。另外,宁愿fgets(buf, len, stdin)而不是gets(str),这不会阻止缓冲区溢出。而且您对一个头寸的查询应该指向pos的地址,而不仅仅是pos。请习惯于将新行字符放在您的printf字符串中。它使得阅读更清晰,并且与缓冲输出流的工作方式相匹配。

相关问题