0

文字列の入力形式はこんな感じ

str1 str2

いいえを知りません。事前に入力する文字数なので、2 つの文字列を保存してその長さを取得する必要があります。Cスタイルの文字列を使用して、scanfライブラリ関数を使用しようとしましたが、実際には長さを取得できませんでした.これは私が持っているものです:

// M W are arrays of char with size 25000
   while (T--)
   {
       memset(M,'0',25000);memset(W,'0',25000);
       scanf("%s",M);
       scanf("%s",W);
       i = 0;m = 0;w = 0;
       while (M[i] != '0')
              {
                  ++m; ++i;  // incrementing till array reaches '0'
              }
        i = 0;
       while (W[i] != '0')
              {
                  ++w; ++i;
              }
       cout << m << w;


   }

memset主に通話が原因で効率的ではありません。

注: を使用したほうがよいでしょうがstd::string、25000 の長さの入力と cin のメモリの制約のため、これに切り替えました。文字列を取得する効率的な方法があれば、それが良いでしょう。

4

3 に答える 3

2

すでに与えられた答えは別として、あなたのコードは少し間違っていると思います:

   memset(M,'0',25000);memset(W,'0',25000);

文字列を文字ゼロ (値 48 または 0x30 [一部の衒学者が私の回答に反対票を投じ、他のエンコーディングがあることを指摘する前に ASCII を想定)) で埋めるつもりですか、それとも NUL (値ゼロの文字) で埋めるつもりですか? 後者は0、ではありません'0'

   scanf("%s",M);
   scanf("%s",W);
   i = 0;m = 0;w = 0;
   while (M[i] != '0')
          {
              ++m; ++i;  // incrementing till array reaches '0'
          }

文字列の末尾を探している場合は、 (上記のように)0ではなくを使用する必要があります'0'

もちろん、scanfは文字列の末尾に a0を追加するので、文字列全体を0[または'0'] で埋める必要はありません。

Andstrlenは、C スタイルの文字列の長さを提供する既存の関数であり、各文字をチェックして 2 つの変数をインクリメントするだけでなく、[少なくとも長い文字列の場合] 高速化するよりも賢いアルゴリズムを使用する可能性が高いです。

于 2013-05-12T08:30:28.650 に答える
1

memsetを使用する場合は必要ありませんがscanf、scanf は'\0'string に終端を追加します。

また、strlen文字列の長さを決定するより簡単な方法は次のとおりです。

scanf("%s %s", M, W); // provided that M and W contain enough space to store the string
m = strlen(M); // don't forget #include <string.h>
w = strlen(W);
于 2013-05-12T08:23:14.677 に答える
0

memset を使用しない C スタイルの strlen は次のようになります。

#include <iostream>
using namespace std;

unsigned strlen(const char *str) {
    const char *p = str;
    unsigned len = 0;
    while (*p != '\0') {
        len++;
        *p++;
    }
    return len;
}

int main() {
    cout << strlen("C-style string");
    return 0;
}

リターン14です。

于 2014-10-05T06:16:09.193 に答える