1

基本的に、文字の入力配列を取得し、rot-13 を使用して結果配列に変換する必要があります。そこで、私が考えていることは次のとおりです。for ループを使用し、for ループ内で条件を使用して、13 桁を加算または減算するかどうかを決定します。しかし、私が問題を抱えているのは、for ループを書くことです。

実装する必要がある関数は次のとおりです。

    void str_rot_13(char const input[], char result []);

for ループを記述すると、次のようになります。

    for (int i = 0; i < size; i++)

テストケースを書きましたが、コンパイラはコンパイルしません。

#include "string.h"
#include "checkit.h"

void str_rot_13_tests(void)
{
   char input[3] = {'a', 'C', 'd'};
   char result[3] = {'n', 'P', 'q'};

   checkit_string(str_rot_13("aCd", 3), "nPq")
}

int main()
{
   str_rot_13_tests();

   return 0;
}

何が間違っていたのかわかりません.9行目でコンパイラが文句を言います.「checkit_string ...」の書き方に関係があると思いますが、よくわかりません.

4

3 に答える 3

1

size = strlen(input)inputNULで終了する文字列、つまり. までループするだけinput[i] == '\0'です。inputは であるため、char*までインクリメントできます*input == '\0'

それが NUL で終了する文字列でない場合は、サイズをstr_rot_13に指定する必要があります。そうしないと、関数に渡されたときに配列の長さを知ることができません (ポインターに減衰するため)。

于 2013-05-16T00:59:49.450 に答える
1
char char_rot_13(char c){
   char new_c = c;

   if (c >= 'a' && c <= 'z')
   {
      new_c = c + 13;
      if(new_c > 'z')
          new_c -= 26;
   }
   else if (c >= 'A' && c <= 'Z')
   {
      new_c = c + 13;
      if(new_c > 'Z')
          new_c -= 26;
   }
   return new_c;
}
void str_rot_13(char const input[], char result []){
    while(*input){
        *result++ = char_rot_13(*input++);
    }
    *result ='\0';
}

テスト:

#include <stdio.h>
#include <string.h>
#include <assert.h>

char *str_rot_13(char const input[], char result[]){
    char *p=result;
    while(*input){
        *p++ = char_rot_13(*input++);
    }
    *p ='\0';
    return result;
}
int main (void){
    char result[128];
    assert(strcmp(str_rot_13("acd", result), "npq")==0);
    printf("%s", result);

  return 0;
}
于 2013-05-16T01:01:09.637 に答える