C程序崩溃......'读入并输出各种数据类型'

时间:2015-10-10 17:47:14

标签: c

更新

我在第4章问题2 上遇到了一些问题。“C编程指南”由Paul Kelly撰写。

据我所知,我的语法是正确的,但是当程序到达第36行时,程序会自动填充scanf();个变量槽。

我无法在任何地方找到解决此问题的方法。

这是我的代码。我在第36行旁边放了一个标记

/* 
   Program to demonstrate single scanf function
   to read various data types and output results.

*/  
#include <stdio.h>

main(){
    int first;
    int second, third, fourth;
    float principle, rate, time;
    char keyVal1, keyVal2;
    char c;
    int i;
    float f;
    double d;

    printf("\nPlease Enter an Integer\n");
    scanf("%d", &first);
    printf("\nYou Entered %d\n", first);

    printf("\nThank You, Please Enter 3 more integers\n");
    scanf("%d %d %d", &second, &third, &fourth);
    printf("\nYou Entered %d %d and %d\n", second, third, fourth);

    printf("\nGreat, 
            now please enter decimal values for principle, 
           rate and time.\n");
    scanf("%f %f %f", &principle, &rate, &time);
    printf("\nYou Entered %.2f %.2f and %.2f\n", principle, rate, time);

    printf("\nPlease Enter any 2 characters\n");
    scanf(" %c %c", &keyVal1, &keyVal2);
    printf("\nYou Entered %c and %c\n", keyVal1, keyVal2); 

    // ***36     
    printf("\nNow Enter any other character, 
            followed by an integer and 2 decimal numbers\n");***
    scanf(" %c %d %f %lf ",&c, &i, &f, &d);
    printf("\nYour character was %c.\nYour integer was %d\nYour 
           decimal numbers were %.2f and %.2lf\n", c, i, f, d);     
} 

3 个答案:

答案 0 :(得分:1)

git rebase --interactive

使用scanf("%1s %1s", &keyVal1, &keyVal2); 说明符代替%c

%1s

同样,

scanf(" %c %c", &keyVal1, &keyVal2);

scanf("%c %d %f %lf ",&c, &i, &f, &d); -

之前留一个空格
%c

您需要留出空间,因为在scanf(" %c %d %f %lf ",&c, &i, &f, &d); ENTER之前的scanf '\n'之后按了stdin

答案 1 :(得分:0)

 scanf("%1s %1s", &keyVal1, &keyVal2);

它应该是......

 scanf(" %c %c", &keyVal1, &keyval2);

你需要使用c标识符来结束崩溃,现在在你这样做之后你会注意到第一个字符似乎没有被读入。这是因为您之前有printf(),因此scanf()会在char printf()中的\n字符中读取printf()。我们必须通过在标识符之前放置一个空格来解决这个问题,因此它不会读取stdin中的最后一个值。 此外,您需要将scanf()语句更改为相同的标识符,否则将会出现未定义的操作&#39;。

此外,最后 scanf(" %c %d %f %lf",&c, &i, &f, &d); 将其更改为此...

Question

通过取出最后一个标识符之后的空格,该程序运行良好。

答案 2 :(得分:0)

问题在于这一行:

scanf(" %c %d %f %lf",&c, &i, &f, &d);

格式字符串末尾的空格意味着所有的空格&#39;消耗,直到在输入流中遇到非空白字符。

因此,在输入4个请求值后,scanf()永远不会完成,直到用户输入非空格字符。

要解决此问题,请删除格式字符串中的尾随空格。

{{1}}