0

所以我的代码成功地将英语转换为猪拉丁语,但是当我将变量传递回 main{} 时,我只能以某种方式返回地址位置或一些十六进制或字符数。我尝试使用不同的转换说明符和所有内容,但由于某种原因,我无法让它输出字符串。该程序从输入 txt 文件中读取,计算翻译,然后打印到输出 txt 文件。让我知道您可能认为是什么问题。谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STR_SIZE 50

char * convertToPigLatin (char * strPtr, char * pLatinStr);

int main(int argc, char *argv[])
{
   char str[MAX_STR_SIZE];
   char pStr[MAX_STR_SIZE];
   char *pStrPtr;
   FILE *fileInPtr;                                     //Create file name
   FILE *fileOutPtr;    

   fileInPtr = fopen("pigLatinIn.txt", "r");    //Assign text to file
   fileOutPtr = fopen("pigLatinOut.txt", "w");

   if(fileInPtr == NULL)                                //Check if file exists
   {
      printf("Failed");
      exit(-1); 
   }
   fprintf(fileOutPtr, "English Word\t\t\t\tPig Latin Word\n", pStr);
   fprintf(fileOutPtr, "---------------\t\t\t\t----------------\n", pStr);

   do                   //Cycles until end of text
   {
      fscanf(fileInPtr, "%29s", str);               //Assigns word to *char

      str[29] = '\0';                           //Optional: Whole line

      pStrPtr = convertToPigLatin(str, pStr); 

      fprintf(fileOutPtr, "%15s\t\t\t\t%15p\n", str, *pStr); 

   }  while(!feof(fileInPtr));   

   system("pause"); 
}

char * convertToPigLatin (const char * strPtr, char * pStrPtr)
{
   int VowelDetect = 0; 
   int LoopCounter = 0; 
   int consonantCounter = 0; 
   char pStr[MAX_STR_SIZE] = {'\0'};
   char cStr[MAX_STR_SIZE] = {'\0'};
   char dStr[] = {'-','\0'}; 
   char ayStr[] = {'a','y','\0'};
   char wayStr[] = {'w','a','y','\0'};

   pStrPtr = pStr; 

   while (*strPtr != '\0')
   {
      if (*strPtr == 'a' || *strPtr == 'e' || *strPtr == 'i' || *strPtr == 'o' || *strPtr == 'u' || VowelDetect ==1)
      {
         strncat(pStr, strPtr, 1); 
         VowelDetect = 1; 
      }
      else
      {
         strncat(cStr, strPtr, 1); 
         consonantCounter++; 
      }
      *strPtr++;
   }
   strcat(pStr, dStr); 
   if (consonantCounter == 0)  
   {
      strcat(pStr, wayStr);
   }
   else
   {
      strcat(cStr,ayStr);
      strcat(pStr, cStr);
   }  
 //printf("%s\n", pStr);                         

   return pStr; 
}
4

1 回答 1

5

您正在pStrconvertToPigLatin函数返回局部变量。此变量使用的存储在函数返回时被释放,并且在函数返回后不再有效(并且可能被下一个函数调用覆盖)。然而,这并不重要,因为您实际上并没有在任何时候使用它。在main()中,您正在pStrPtr = convertToPigLatin(str, pStr);分配给pStrPtr转换后的字符串的(现在无效的)地址,但是当您调用 时printf(),您传递它str(原始字符串)和(从未初始化或使用*pStr的数组的第一个字符)。char[]最重要的,您传递给的格式说明符printf()%15s%15p,因此您将作为第二个变量传递给的单个字符printf()?你printf()说它是你想要显示的指针。

我从通读中看到的问题的快速列表:

  • fprintf()显示表头的两个调用每个都有一个未使用的额外参数(无害)。
  • 毫无意义str[29] = '\0'fscanf()它将为您获得的字符串以空值结尾,并且您的缓冲区无论如何都大于该值。
  • convertToPigLatin()中,您立即丢弃传入的指针pStrPtr,然后甚至不再接触该变量。
  • 严重地?用来strncat()复制一个字节?
  • 您初始化字符串常量dStrayStrwayStr的方法虽然有效,但很奇怪。(为什么不只是char *dStr="-", *ayStr="ay", *wayStr="way"
  • 您正在返回一个本地自动变量convertToPigLatin()
  • 你永远不会使用从返回的值convertToPigLatin()
于 2013-07-25T02:59:15.947 回答