2012-12-11 51 views
2

我是“C”的学习和编写的代码,但在我编译它,显示调试错误消息,这里是代码:获取调试错误使用C

#include<stdio.h> 
void main() 
{ 
    int n,i=1; 
    char c; 
    printf("Enter Charecter:\t"); 
    scanf("%s",&c); 
    printf("Repeat Time\t"); 
    scanf("%d",&n); 
    n=n; 
    while (i <= n) 
    { 
     printf("%c",c); 
     i++; 
    } 
} 

请告诉我为什么出现这种情况,如何解决呢

+2

你能告诉我们实际的错误信息吗? – Almo

+1

'N = N;' - 这是什么打算呢? – mah

+0

你有'主要'功能不兼容标准 – triclosan

回答

2

我不知道你明白的回答你的其他问题:Odd loop does not work using %c

这些format specifiers分别用于特定的工作。

如果你想获得一个:

  • 字符从stdin使用%c
  • 字符串(一串字符)使用%s
  • 整数使用%d

此代码:

char c; 
printf("Enter Character:\t"); 
scanf("%c",&c); 

将从stdin读1个字符,并会留下一个换行符('\n')字符出现。所以我们可以说,用户输入的字母A你有stdin缓冲:

A\n 

scanf()将拉动'A'并将其存储在您的char c和将离开的换行符。接着,它会询问你的int和用户可能输入5stdin现在有:

​​

scanf()将采取5并将其放置在int n。如果你想消费'\ n'有一些选项,其中一个是:

char c; 
printf("Enter Character:\t"); 
scanf("%c",&c); // This gets the 'A' and stores it in c 
getchar();  // This gets the \n and trashes it 
+0

感谢Mike现在对我很清楚,helpz a lottt ,,:D –

+0

@JessicaLingmn - 很高兴帮忙,换行符似乎让很多人出去了 – Mike

3

scanf("%s",&c);应该scanf("%c",&c);

%s格式说明符告诉scanf你传递一个字符数组。您传递的是单个字符,因此需要使用%c

您当前的代码将出现不可预知,因为scanf会尝试写一个任意长的字,接着一个NUL终止向您提供的地址。这个地址为单个字符分配了内存(在堆栈上),所以最终会覆盖可能被程序其他部分使用的内存(比如其他局部变量)。

+0

感谢您的观念帮助很多:) –

3

scanf("%s", &c)被写入存储器它不应该作为c是单char"%s"预计其一个参数是一个数组。由于scanf()附加一个空字符,它至少会写两个charccharstdin读取加上空终止符),这太多了。

使用char[]和限制的charscanf()写入数:

char data[10]; 
scanf("%9s", data); 

并使用printf("%s", data);代替%c,或使用"%c"作为scanf()格式说明。

经常检查scanf()的返回值,这是成功的分配数量,以保证后续的代码不处理陈旧或初始化的变量:

if (1 == scanf("%d", &n)) 
{ 
    /* 'n' assigned. 'n = n;' is unrequired. */ 
} 
+0

感谢您的信息 –

0

这里是你的代码的工作版本。请参阅联代码注释的修订:

#include<stdio.h> 
void main() 
{ 
    int n,i=1; 
    char c; 
    printf("Enter Character:\t"); 
    scanf("%c",&c);//Use %c instead of %s 
    printf("Repeat Time\t"); 
    scanf("%d",&n); 
    n=n;//SUGGESTION:This line is not necessary. When you do scanf on 'n' you store the value in 'n' 
    while (i <= n)//COMMENT:Appears you want to print the same character n times? 
    { 
     printf("%c",c); 
     i++; 
    } 
    return;//Just a good practice 
} 
+0

1 )void main是极其糟糕的*练习。 2)如果I/O缓冲(它可能将是),就不会看到从printf的输出时的scanf完成 3)N = N分配是完全没有意义的。 –

+0

亚我想打印相同的字符n次...感谢让我感觉:) –

+1

@汤姆坦纳:1)同意。 gcc通常不会允许这样的代码。但是,因为它知道哪个编译器OP使用,尽最大努力保持代码不变。 2)取决于缓冲机制。但是,代码是有效的C,并且肯定会按预期工作。 3)我已经建议将OP作为评论中的在线评论。 – askmish