0

そのため、英語を豚ラテン語に正常に変換するコードを取得しましたが、変数を main{} に戻すと、アドレスの場所または 16 進数または char 番号しか返せません。さまざまな変換指定子などを使用しようとしましたが、何らかの理由で文字列を出力できません。このプログラムは、入力 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

pStr関数からローカル変数を返していconvertToPigLatinます。この変数によって使用されるストレージは、関数が戻ると割り当てが解除され、関数が戻ると有効ではなくなります (次の関数呼び出しで上書きされる可能性があります)。ただし、実際にはどの時点でも使用していないため、それは実際には問題ではありません。では、変換された文字列の (現在は無効な) アドレスに代入しよmain()うとしていますが、 を呼び出すと、 (元の文字列) と(初期化も使用もされていない配列の最初の文字)を渡します。それに加え、渡すフォーマット指定子はとpStrPtr = convertToPigLatin(str, pStr);pStrPtrprintf()str*pStrchar[]printf()%15s%15p、そのため、2番目の変数として渡す単一の文字はprintf()? 表示したいポインタだと言っprintf()ています。

読み飛ばして見た問題の簡単なリスト:

  • テーブル ヘッダーを表示するへの 2 つの呼び出しにfprintf()は、それぞれ未使用の余分な引数があります (無害です)。
  • Pointlessstr[29] = '\0'は、fscanf()取得した文字列を null で終了し、バッファはそれよりも大きくなります。
  • ではconvertToPigLatin()、渡されたポインタをすぐに破棄し、pStrPtrその変数に再び触れることさえありません。
  • 真剣に?strncat()1バイトをコピーするために使用しますか?
  • dStr文字列定数、ayStr、およびを初期化する方法はwayStr有効ですが、奇妙です。(なぜだけではないのchar *dStr="-", *ayStr="ay", *wayStr="way"ですか?
  • からローカル自動変数を返していますconvertToPigLatin()
  • から返された値を使用していませんconvertToPigLatin()
于 2013-07-25T02:59:15.947 に答える