2013-05-12 3 views
0

Формат входной строки, как этотВходная строка C-стиль и получить длину

str1 str2

Я не знаю, что нет. символов, которые нужно ввести заранее, поэтому вам нужно сохранить 2 строки и получить их длину. Использование строк C-стиле, пытались из использования функции библиотеки зсапЕ, но на самом деле неудачная в получении length.This является то, что у меня есть:

// 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, но затем из-за 25 тысяч длины входных и памяти ограничения КИН я переключился на this.If есть эффективный способ, чтобы получить строку, то было бы хорошо

+0

Поскольку это C++, вы должны использовать 'станд: string' и C++ I/O - вы всегда можете получите строку C из строки 'std :: string', если она вам действительно нужна. –

ответ

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 поставит 0 в конец строки для вас, так что нет никакой необходимости, чтобы заполнить всю строку с 0 [или '0'].

И strlen - это существующая функция, которая даст длину строки стиля C и, скорее всего, будет иметь более умный алгоритм, чем просто проверка каждого символа и увеличение двух переменных, что делает его более быстрым [для длинных строк по крайней мере] ,

1

memset при использовании scanf, scanf добавляет завершающий '\0' к строке.

Кроме того, 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); 
0

C-стиле StrLen без MemSet может выглядеть следующим образом: возвращение

#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.