2016-07-16 8 views
1
  • 目的:入力する文字列の数を取得し、文字列を読み取って文字列を反転して文字列を出力します。fgetsを使用して文字列を読み取ると、2番目の文字列の出力が得られませんでした。

    ba 
    
  • 次の文字列

    #include <stdio.h> 
    
    int main() { 
        int num_tc, index_tc, char_idx, str_len = 0; 
        char S[31]; 
    
        scanf("%d\n", &num_tc); 
    
        for (index_tc = 1; index_tc <= num_tc; index_tc++) { 
         fgets(S, sizeof(S), stdin); 
    
         /* To compute the string length */ 
         for (char_idx = 0; S[char_idx] != NULL; char_idx++) 
          str_len++; 
    
         /* Reverse string S */ 
         for (char_idx = 0; char_idx < str_len/2; char_idx++) { 
          S[char_idx] ^= S[str_len - char_idx - 1]; 
          S[str_len - char_idx - 1] ^= S[char_idx]; 
          S[char_idx] ^= S[str_len - char_idx - 1];   
         } 
         puts(S); 
        } 
        return 0; 
    } 
    
  • プログラムへの入力

     2<\n> 
        ab<\n> 
        aba<\n> 
    

    出力が親切に2番目の文字列は、文字列の反転のために取られていない理由を私は知っているように進みます。

  • 私は、文字列の反転ロジックを削除した場合、私はあなたがループの本体に0str_lenをリセットしません両方の文字列が出力

答えて

2

見ることができました。 2番目の文字列の長さが正しくないため、2番目の文字列が正しく反転されません。あなたは、文字列を反転させる前に、末尾の'\n'を取り除く必要があります

for (str_len = 0; S[str_len] != '\0'; str_len++) 
    continue; 

注:へのループを変更します。 str_lenを計算する前にS[strcspn(S, "\n")] = '\0';でこれを行うことができます。 gopi_2363 @

#include <stdio.h> 

int main(void) { 
    int num_tc, tc, len, left, right; 
    char buf[31]; 

    if (scanf("%d\n", &num_tc) != 1) 
     return 1; 

    for (tc = 0; tc < num_tc; tc++) { 
     if (scanf("%30s", buf) != 1) 
      break; 

     /* Compute the string length */ 
     for (len = 0; buf[len] != '\0'; len++) 
      continue; 

     /* Reverse string in buf */ 
     for (left = 0, right = len - 1; left < right; left++, right--) { 
      buf[left] ^= buf[right]; 
      buf[right] ^= buf[left]; 
      buf[left] ^= buf[right];   
     } 
     puts(buf); 
    } 
    return 0; 
} 
+0

:ここ

は、個々の単語を逆にscanf()を使用して簡略化し、ある解答スコア下のグレーのチェックマークをクリックして受け入れられるよう、あなたはこの答えをマークすることができますか? – chqrlie

+0

1)S [strcspn(S、 "\ n")] = '\ 0';私はこのプログラムで助けになるかどうか分からない。 2)私はscanfで同じプログラムを書くことができますか?(私は[link](http://stackoverflow.com/questions/6282198/reading-string-from-input-with-space-character)で試しました)3)このscanf( "%d \ n"、&num_tc)を置くには良い方法がありますか? –

+0

あなたはラインの内容を逆にすることになっています。ラインフィードを前に置いて、 'puts()'で別の改行を追加するのは不適切です。改行を取り除くことは、適切なセマンティクスのようです。提案された方法は、すべての場合に有効です。ループ内で '\ 0 'と'' \ n ''の両方をテストし、 'S [str_len]'に ''\ 0' 'を強制するなど、他の方法を想像することもできます。 – chqrlie

関連する問題