1

最近のインタビューで、null 文字をチェックせずに無制限の文字列を逆にするコードを書くように頼まれました。文字列の長さがわからず、ライブラリ関数をどのような形式でも使用できません..


私は次のコードを書きました (これは多くの理由で正しくないことがわかっています。その 1 つは、文字列を '\0' で終了しているのではなく、代わりに CTRL+Z または CTRL+D で終了しているためです)。


while(scanf("%c",arr[i++])!=-1);

for(i--;i>=0;i--)
     puts(arr[i]);

可能なアルゴリズムは何ですか!!

4

3 に答える 3

3

たぶん次のようなものです:

void
reverse_print(const char* string) {
    if (*string == 0) {
       return;
    }
    reverse_print(string + 1);
    putchar(*string);
}

または、入力から文字列を読み取る:

void
reverse_print() {
    char c;
    if (1 != scanf("%c", &c)) {
        return;
    }
    reverse_print();
    putchar(c);
}
于 2012-08-09T07:44:10.623 に答える
0
#include <stdio.h>

int main(void)
{
  char* string1 = "This is me the right guy!! understood !!!";
  char* string = string1;
  char *nonstring = "\x01\x05\x0a\x15";
  int len = 0;

  while ((*string ^ nonstring[0]) && (*string ^ nonstring[1])
      && (*string ^ nonstring[2]) && (*string ^ nonstring[3])
      && (*string ^ nonstring[4]))
  {
    len++;
    string++;
  }
  //printf("%d\n", len); 
  while(len)
  {
    printf("%c", string1[--len]);
  } 
  return 0;
}
于 2012-08-09T07:56:35.737 に答える
0

入力から文字列を読み取って、印刷しようとしているようです。

文字数を数えるだけで、次のような通常の配列のように扱うことができます。

int main() { 
int i = 0;
char arr[256];
while(scanf("%c",arr + (i++))!=-1);
for(i = i-1; i+1; i--) putchar(arr[i]);

return 0;
}

配列が完全に制限されていない場合は、スペースが不足していないことを確認し、不足している場合は再割り当てする必要があります。

完了したら、手動で NULL ターミネータを追加することもできます。チェックしていないので、要件に問題がないはずです。

于 2012-08-09T07:56:57.530 に答える