2013-05-12 62 views
0

字符串输入格式是这样输入C风格的字符串并获得长度

STR1 STR2

我不知道没有了。要预先输入的字符,所以需要存储2个字符串并获得它们的长度。 使用C风格的字符串,试图利用scanf函数库函数,但在获得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但随后的CIN I切换到this.If有一个有效的方式来获得一个字符串,因为25000长度的输入和内存的限制,然后它会是不错的

+0

由于这是C++,你应该使用'STD:string'和C++的I/O - 可以随时如果你真的需要它,可以从'std :: string'获得一个C字符串。 – 2013-05-12 08:15:16

回答

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

使用scanf时,您不需要memset,scanf将字符串添加终止。

此外,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

没有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