【问题标题】:%c keeping new line char in while loop, fix?%c 在 while 循环中保留新行字符,修复?
【发布时间】:2017-07-09 21:52:58
【问题描述】:
/*Title: P3.c
Location: ~/csc1710/P3/P3.c
Class: CSC1710
Name: Emily
Date: 02-18-2017

This program is meant to convert a colored image to black and white.*/

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

int main(void)
{
   int height, width;
   char red;
   char green;
   char blue;
   char imageType[3];
   char comment[256];
   char newlinechar;
   int mcc;
   unsigned char color;

   //scan and print for image type
   fscanf(stdin,"%[^\n]%c",imageType,&newlinechar);
   strncpy(imageType,"P2",3);
   fprintf(stdout,"%s\n",imageType);

   //scan and print for comment
   fscanf(stdin,"%[^\n]%c",comment,&newlinechar);
   strncpy(comment,"#EMILY MORAN Black and White Conversion Routine, Version 0.1",256);
   fprintf(stdout,"%s\n",comment);

   //scan and print for height and width
   fscanf(stdin,"%d %d",&width,&height);
   fprintf(stdout,"%d %d\n",width,height);

   //scan and print for max color code
   fscanf(stdin,"%d",&mcc);
   fprintf(stdout,"%d\n",mcc);

   //while loop for RGB numbers
   while(fscanf(stdin," %c", ,&red)!=EOF){   
      fscanf(stdin,"%c",&green);
      fscanf(stdin,"%c",&blue);

      color =(unsigned char)0.3*red+0.5*green+0.2*blue;

      fprintf(stdout,"%hhu\n",color);
   }

  return(0);
  }

以上是我的 CSC 课程的编程项目。该项目的第一部分是通过使用整数值将 ppm 图像转换为 pgm(对其进行灰度缩放)。这部分在我的图像编辑器中非常适合我。

第二部分是通过使这些整数值字符来使用更少的空间。但是,我现在遇到了图像显示不正确的问题。它仍然是灰度的,但与第一张图像不同。今天早上我的教授谈到了这个错误,即循环没有跳过新行,但是当我尝试在我的 while 循环中编辑我的 fscanf 以显示为 newImage 和注释时,编译器会抱怨分段失败。

顺便说一句,我们正在将一个 .ppm 文件输入到程序中,然后输出一个新的 .pgm 值。

谁能帮我看看我的代码中的问题?谢谢!

【问题讨论】:

  • 通过“使这些整数值字符”,你的意思是把它们写成二进制数据?您如何区分换行符和字节值 10?这里有些不匹配。无论如何,如果您使用的是二进制数据,请不要使用fscanf 来读取它(我可能会使用getc 来处理类似的事情)。
  • 如果您使用调试器(如 gdb),它应该会告诉您在哪一行出现分段错误
  • 你用的是什么输入法?
  • 它们不是二进制数据。只是红色、绿色和蓝色的整数值列表。间隔为:第四行之后的红绿蓝。另外,我相信分段错误与 while 循环在同一行。输入是 .ppm 文件
  • 最好使用while(fscanf(stdin," %c%c%c", ,&amp;red, &amp;green, &amp;blue) == 3){ 读取3个字符并确保成功。

标签: c char newline grayscale


【解决方案1】:

当您输出新的颜色数据时,您将包含一个\n 字符

fprintf(stdout,"%hhu\n",color);

当它应该是一个连续的块时。所以应该是这样的

fprintf(stdout,"%hhu",color);

【讨论】:

  • 文件顶部的 P2 也应更改为 P5,因为这是您输出的 pgm 文件类型的正确文件类型。
  • 对于任何想知道的人,我的教授和我发现了这个错误,最后的无符号字符应该是一个字符。感谢您的所有帮助!
【解决方案2】:

对于任何想知道的人,我的教授和我发现了这个错误,最后的 unsigned char 应该是一个 char。感谢您的所有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 2017-01-20
    • 2015-01-05
    • 2022-06-15
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多