1

私は HW の課題で立ち往生しており、英語の単語の束 (入力 .txt ファイルの改行で区切られたリスト内) をピッグ ラテン語の単語の束 (リストに) に変換するプログラムを作成する必要があります。出力 .txt ファイルでは改行で区切られています)。私は本当に近づいてきましたが、strncat私が使用している関数(文字列連結)関数はどういうわけか新しい行を投げていますstdout。なぜこれが起こっているのでしょうか?これが私のコードです:

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

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");

   //pStrPtr = pStr; 

   if(fileInPtr == NULL)                                //Check if file exists
   {
      printf("Failed");
      exit(-1); 
   }


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

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

      convertToPigLatin(str, pStr); 
      fprintf(fileOutPtr, "%s", 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(pStr, cStr);
      strcat(pStr, ayStr);
   }  
   printf("%s", pStr);                       

 //  return pStrPtr; 
}
4

3 に答える 3

2

このコードにはさまざまな奇妙な点がありますが、あなたが求めている問題は、while ループによって作成されますconvertToPigLatin。あなたは while をループしますが*strPtr != '\0'\n確かにそうではないので\0、それを に追加していpStrます。

コードの残りの部分については、いくつかのコメントのみを示します。

  • 1文字をstrncatコピーするのは変な使い方です。通常、代わりに単純な文字割り当てを使用します ( のようにstr1[i] = str2[j]) 。
  • *strPtr++ポインターをインクリメントして逆参照していますが、逆参照された値で何もしていません。あなたはstrPtr++そこに欲しいだけです。
  • を使用して文字列リテラルを作成できますchar str[] = "some string"。配列の初期化構文を使用する必要はありません。

それらは、詳細な読み取りなしで私に飛びついたものです。今後の任務を頑張ってください。

編集して、デバッガーを使用してコードをステップ実行することは、これらの場合に非常に価値があります。改行が追加されている場所を正確に確認できます。

于 2013-07-25T00:58:14.047 に答える
1

問題は strncat ではなく、入力にあります。

fgets(str, 29, fileInPtr);                //Assigns word to *char
str[29] = '\0';                           //Optional: Whole line

29 文字以外を入力すると、ハード リターンは上書きされません。代わりにこれを使用してください:

str[strlen(str)-1] = 0;

..実際には、ハードリターンでなくても( 29文字以上入力した場合)、常に29文字目が上書きされます。したがって、より良い解決策は

char *ptr = strchr(str, '\n');
if (ptr) *ptr = 0;

MAX_STR_SIZEfgets _

[r]stream から文字を読み込み、(num-1) 文字が読み込まれるか、改行またはファイルの終わりに到達するまで、C 文字列として str に格納します。( http://www.cplusplus.com/reference/cstdio/fgets/ )

-- 最後の文字は、終端のゼロまたはハード リターンである可能性があります。

于 2013-07-25T01:00:23.413 に答える
0

@セルビーは正しいです、

*strPtr++;

==>

++strPtr;

これも convertToPigLatin を呼び出す前に追加します

if(str[0] == '\0')
        break;    

pigLatinOut.txt はラテン語で機能しますが、すべて 1 行で機能します。

このように : (私はラテン語について何も知りません。それでよろしいですか?):

pigLatinIn.txt

hello world!
I am line one!
I am line two!
I am line three!

pigLatinOut.txt

𬌿\q·ð¬Œ¿\q·ð¬Œ¿\q·ð¬Œ¿\q·
于 2013-07-25T01:27:16.440 に答える