2

我是'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++;
    }
}

请告诉我为什么会发生这种情况以及如何解决它

4

4 回答 4

3

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

%s格式说明符告诉您scanf正在传递一个 char 数组。您正在传递一个字符,因此需要%c改用。

您当前的代码将表现出不可预测的行为,因为scanf将尝试向您提供的地址写入一个任意长的单词,后跟一个 nul 终止符。该地址为单个字符分配了内存(在堆栈上),因此您最终会覆盖程序其他部分可能使用的内存(例如其他局部变量)。

于 2012-12-11T14:48:48.797 回答
3

scanf("%s", &c)正在写入内存,它不应该是c一个单一的char,而是"%s"希望它的参数是一个数组。当scanf()附加一个空字符时,它至少会写入两个charc读取charstdin加上空终止符),这是一个太多了。

使用 achar[]并限制char写入的数量scanf()

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

并使用printf("%s", data);代替%c"%c"用作 中的格式说明符scanf()

始终检查 的返回值scanf(),即成功分配的次数,以确保后续代码不会处理陈旧或未初始化的变量:

if (1 == scanf("%d", &n))
{
    /* 'n' assigned. 'n = n;' is unrequired. */
}
于 2012-12-11T14:49:19.093 回答
2

我不确定您是否理解其他问题的答案:Odd loop does not work using %c

这些格式说明符均用于特定作业。

如果您想获得:

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

这段代码:

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

将从中读取 1 个字符stdin并在此处留下换行符 ( '\n') 字符。因此,假设用户在您拥有Astdin缓冲区中输入了字母:

A\n

scanf()拉取'A'并将其存储在您的中char c,并将留下换行符。接下来它会询问您的 int 并且用户可能会输入5. stdin现在有:

\n5

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
于 2012-12-11T15:04:51.210 回答
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
}
于 2012-12-11T14:53:39.360 回答