C数据类型从stdin读取不同的输入并打印更改的数据

时间:2016-07-11 15:06:19

标签: c

使用名为HackerRank的网站the challenge here在我的C蜘蛛网上除尘是从stdin读取3个不同的输入,然后打印出更改的数据。

输入

  

第一行包含整数

     

第二行包含双重

     

第三行包含一个字符串/句子

输出

  

整数输入+变量i

     

双输入+变量d

     

变量s +字符串输入

看起来很直接,我会使用scanf作为整数 double 然后使用fgets作为字符串因为scanf将在第一个空格后终止。

我的问题是,似乎fgets似乎没有填充buffer,但我不确定它是否可能是网站编译器或仅仅是我缺乏知识。

int i = 4;
double d = 4.0;
char s[] = "HackerRank ";

// Declare second integer, double, and String variables.
int singleNum;
double doubleNum;
char buffer[256];
char outputString[300];

// Read and save an integer, double, and String to your variables.
scanf("%d", &singleNum);
scanf("%lf", &doubleNum);
fgets(buffer, 256, stdin);

// Print the sum of both integer variables on a new line.
singleNum += i;
printf("%d\n", singleNum);

// Print the sum of the double variables on a new line.
doubleNum += d;
printf("%.1f\n", doubleNum);

// Concatenate and print the String variables on a new line
strcat(outputString, s);
strcat(outputString, buffer);

printf("%s", outputString);
// The 's' variable above should be printed first.

但是,当我这样做时,buffer始终为空。如果我使用scanf,我至少会在字符串输入前面得到第一个单词。

这里没有超级关注内存使用情况,只是试图在固定参数内完成问题。

所以,我的问题是 - 我在这里做错了吗?

我的输出:

  

输入(stdin)

12
4.0
is the best place to learn and practice coding!
     

您的输出(标准输出)

16
8.0
HackerRank 
     

预期输出

16
8.0
HackerRank is the best place to learn and practice coding!
     

编译器消息

Wrong Answer

3 个答案:

答案 0 :(得分:2)

  

但是,当我这样做时,缓冲区始终为空。如果我使用scanf,我至少会在字符串输入前面得到第一个字。

问题是'\n'中的空格(buffer在扫描双倍数字的末尾输入)正在消耗

white space

中进行扫描之前,

使用scanf(" ");消费buffer

scanf(" ");
fgets(buffer, 256, stdin);
  

有没有办法在scanf语句中包含换行符,所以我不需要额外的一个?

  • 是的,您可以进一步将上述两个陈述简化为:

    scanf(" %255[^\n]",buffer); //consumes and scans into buffer
    
  • 或者你也可以:

    scanf("%lf\n", &doubleNum); //consume at the end
    fgets(buffer, 256, stdin); //scan into buffer
    

答案 1 :(得分:1)

这里有一个明显的问题是声明了outputString,但没有初始化:

char outputString[300];

我假设它在块作用域中声明,因此它包含垃圾值,无论堆栈中是什么。这可能会使strcat混淆,后者期望NUL终止:

strcat(outputString, s);

修复将在strcat调用之前添加以下行:

outputString[0] = '\0'; 

答案 2 :(得分:0)

I have solved the Hackerrank C dataType First day challenge problem without using strcat function. Below is the solution to this problem.  

  int main() {
    int i = 4;
    double d = 4.0;
    char s[] = "HackerRank ";

// Declare second integer, double, and String variables.`enter code here`    
     int i1=0;
     double d1=0.0;
     char name[100];

    // Read and save an integer, double, and String to your variables.

     scanf("%d",&i1);
     scanf("%lf",&d1);
     getchar(); // Used this function to remove the '\n'from double. 
     scanf("%[^\n]s",name);

    // Print the sum of both integer variables on a new line.
     printf("%d\n",i+i1);

    // Print the sum of the double variables on a new line.
        printf("%0.1lf\n",d+d1);   

    // Concatenate and print the String variables on a new line
    // The 's' variable above should be printed first.
     printf("%s%s\n",s,name);    

    return 0;
}