我需要循环中的while循环帮助

时间:2011-03-07 19:52:41

标签: c

我需要帮助将代码转换为易读的形式,以便每行代码在其resspective行下面都具有清晰的形式。我正在读取一个连续的txt行的文件,该行将被解码。我知道我需要一个while循环来找到行尾字符,但我不太清楚如何编写它。我的代码在

之下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


main()
{
    char* ptr;              /* Declare a pointer */
    int i;int shift = -2 ;
    int STR_LENGTH;
    int SIZE;               /* Declare our variables */
    char mystring [150];    /* Declare a string */

    FILE * pFile;

    pFile = fopen ("myfile.txt" , "r");
    if (pFile == NULL)
        perror ("Error opening file");
    else
    {
        fgets (mystring , 150 , pFile);
        puts (mystring);

        STR_LENGTH=strlen(mystring); /* Get the string length */
        SIZE=sizeof(mystring);       /* Get the sizeof the string */

        /* Print out the values */
        printf("\n the value in strlen is %d size is %d\n",STR_LENGTH,SIZE);
        /* Point the pointer at the first element */ 
        ptr = &mystring[0];

        for (i = 0; i < STR_LENGTH; i++) /* Set up the loop */
        {
            /* Shift the first character in the string */
            *ptr = mystring[i]+shift;

            ptr++;                          /* Increment the counter */
        }
        printf("The code is!!\n");          /* Print out the result */
        printf("%s",mystring);

        fclose (pFile);
    }
}

完成的程序应该像这样打印

K"jcxg"c"oqwvj"."K"fq"pqv"urgcm
i have a mouth i do not speak
K"jcxg"hqwt"g{gu"."dwv"ecppqv"ugg
i have four eyes but cannot see
K"jcxg"c"dgf"."dwv"fq"pqv"unggr
i have a bed but do not sleep
Ecp"{qw"vgnn"og"yjq"K"dgA"
you tell me who i be?

相反,它使用现有代码

读取
K"jcxg"c"oqwvj"."K"fq"pqv"urgcmK"jcxg"hqwt"g{gu"."dwv"ecppqv"uggK"jcxg"c"dgf"."dwv"fq"pqv"unggrEcp"{qw"vgnn"og"yjq"K"dgA"
i have a mouth i do not speak
i have four eyes but cannot see
i have a bed but do not sleep
you tell me who i be?

即时通讯使用turboC非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

fgetsputs函数不知道您的换行符已编码,因此他们不知道在哪里打破字符串。这就是为什么输出在任何解码输出之前在一行上显示整个编码输入的原因。

解决此问题的一种方法是在打印之前将正常的换行符添加到编码的字符串中。另一个类似的选项是手动遍历输入字符串,找到编码的换行符,并将输入字符串分成四个单独的字符串(您可以单独转换和打印)。

您发布的代码不会生成您发布的输出,因此很难为您提供任何具体的代码建议。请提供可运行的,可编译的代码示例及其生成的输出,我们将能够为您提供更有用的反馈。你可以在没有在另一个循环中嵌套循环的情况下解决这个问题(但是你发布的代码只有一个循环,因此很难看到你的第二个循环来自哪里)。

答案 1 :(得分:0)

试试这个:

i = 0;
ptr = & mystring[0];
while (i < STR_LENGTH)
{
     * ptr = mystring[i] + shift;
     if (* ptr = '\n')
     {
         printf("%s", mystring);
         i = STR_LENGTH;
     }
     else
     {
        i++;
        ptr++;
     }
} 

编辑:这假设你将有一个外部循环,用新的密文文本加载mystring。 (抱歉第一版中的循环终止符不正确)

答案 2 :(得分:0)

不是答案,所以社区维基。

我相信这会重新创建输入文件,就像OP使用的那样:

#include <stdio.h>
/* #define FILENAME "myfile.txt" */
#define FILENAME "5224516.txt"

int main(void) {
  FILE *f;
  char data[] = {
    75,34,106,99,120,103,34,99,34,111,113,119,118,106,34,46,34,75,34,
    102,113,34,112,113,118,34,117,114,103,99,109,12,75,34,106,99,120,
    103,34,104,113,119,116,34,103,123,103,117,34,46,34,100,119,118,
    34,101,99,112,112,113,118,34,117,103,103,12,75,34,106,99,120,103,
    34,99,34,100,103,102,34,46,34,100,119,118,34,102,113,34,112,113,
    118,34,117,110,103,103,114,12,69,99,112,34,123,113,119,34,118,
    103,110,110,34,111,103,34,121,106,113,34,75,34,100,103,65,
#ifdef _WIN32
    13,
#endif
    10
  };

  f = fopen(FILENAME, "wb");
  if (f == NULL) {
    perror("file open");
  } else {
    size_t n;
    n = fwrite(data, 1, sizeof data, f);
    if (n != sizeof data) perror("file write");
    if (fclose(f)) perror("file close");
  }

  return 0;
}