【问题标题】:Don't understand reversing the string from a file into another file不明白将字符串从一个文件反转到另一个文件
【发布时间】:2014-07-14 04:51:00
【问题描述】:
void stringReverse(char *s) {

char temp;

int i = 0;

int j = strlen(s) - 1;

while (i >= j)
{
    temp = s[i];
    s[i] = s[j]; //swap the characters
    s[j] = temp;
    i++;
    j--;

}

} 

这是函数stringReverse(char *s),我必须在其中调用下面的主函数

int main(int argc, char *argv[])
{
    FILE *in; /* file handle for input */
    FILE *out; /* file handle for output */
    char word[256]; /* char array to store words from input file */

    /* read words from input file, print on separate lines to output file*/
    while ( fscanf(in, " %s", word) != EOF )
    {
        out = stringReverse(char *word);
        fprintf(out, "%s\n", word);
    }

    /* close input and output files */
    fclose(in);
    fclose(out);

    return (EXIT_SUCCESS);
}

我很难理解我应该如何调用stringReverse 函数。我的计划是从文本文件中反转一个单词并将其反转放入另一个空文件中

【问题讨论】:

  • s是参数还是函数中的局部变量?
  • @Dani 计数器变量...循环中非常熟悉的变量。
  • 您的代码看起来像是反转每个单词,而不是反转文件
  • 调用函数时不指定类型。您只需指定参数。因此,您可以按如下方式调用 stringReverse:“stringReverse(word)”。您将其称为“stringReverse(char *word)”。声明和定义函数需要类型,而不是调用函数。
  • while (i >= j) 永远不会满足!!试试<=

标签: c


【解决方案1】:

好的。我阅读了所有的 cmets,但我没有足够的声誉来发表评论。所以我添加一个答案。

您的标签上写着不理解反转字符串。反转字符串有两种方法。

第一种方式:

输入:嗨,你好吗
输出:你好

第二种方式

输入:嗨,你好吗
输出:uoy era woh iH

您的最后声明说您要反转文件。

int main(int argc, char *argv[])
{
   long loc;
   FILE *in, *out;
   char ch;

   if(argc != 3) {
       printf("Usage: revcopy <source> <destination>.\n");
       exit(1);
   }

   if((in = fopen(argv[1], "rb")) == NULL) {
      printf("Cannot open input file.\n");
      exit(1);
   }

  if((out = fopen(argv[2], "wb"))==NULL) {
     printf("Cannot open output file.\n");
     exit(1);
   }

  /* find end of source file */
  fseek(in, 0L, SEEK_END);
  loc = ftell(in);

 /* copy file in reverse order */
 loc = loc-1; /* back up past end-of-file mark */

 while(loc >= 0L) {
    fseek(in, loc, SEEK_SET);
    ch = fgetc(in);
    fputc(ch, out);
    loc--;
}
  fclose(in);
  fclose(out);

  return 0;
}

上面的代码会给你第一种答案[“你是多么嗨”].. 如果你想进一步反转它,你必须使用你的 stringReverseFunction

[我假设s是一个词,它是一个实参,i指向词的开头,j指向词尾这个词的。然后就可以正常工作]

【讨论】:

    【解决方案2】:

    您可以使用fgets 将整个文件存储在字符串中,然后对其执行反向逻辑。

    链接到 --> fgets

    strrev 来自this Link

    类似的东西

    #include <stdio.h>
    
    #include <string.h>
    
    
    char *strrev(char *str)
    {
    /* u can define your own logic here*/
      char *p1, *p2;
    
      if (! str || ! *str)
            return str;
      for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
      {
            *p1 ^= *p2;
            *p2 ^= *p1;
            *p1 ^= *p2;
      }
      return str;
    }
    
    int main()
    {
       FILE *myFile;
       char myTmpString [100];
    char myInvertedString [110];
       myFile = fopen ("input.txt" , "r");
       if (myFile == NULL) 
           perror ("An Error Occured");
       else {
         fgets (myTmpString , 100 , myFile);
        *myInvertedString =  strrev (myTmpString);
    
         puts (myTmpString);
         fclose (myFile);
       }
       return 0;
    }
    

    【讨论】:

    • *myInvertedString = strrev (myTmpString); 将导致warning: assignment makes integer from pointer without a cast [enabled by default]
    • yes.. 这在 c 中已被弃用,我们可以重写以避免此警告 --> link to SO answer
    • 这意味着,您正在将strrev(即char*)的返回值写入myInvertedString(即char)的第一个值
    【解决方案3】:
    1. 首先,您还没有opened您打算读取和写入的文件:

      in = fopen("path_to_input_file", "r");
      out = fopen("path_to_output_file", "w");
      
    2. 然后,您的 stringReverse 函数的返回类型似乎是 void。你为什么要把它的回报分配给out?那是错误的。

    3. 您的stringReverse 函数将原地反转字符串。因此,一旦在word 上调用该函数,变量的内容就会反转。

    休息似乎还可以。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 2014-02-13
      • 2023-04-08
      • 2019-03-21
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多