2013-05-28 292 views
-3
int string_length(char str[]) 
{ 
int i; 
for(i=200; i>=0; i--) 
{ 
    //printf("%c \n",str[200]); 
    printf("%d",i); 
    if(str[i] !=NULL) 
{ 
    return(i); 
    } 
    } 
} 

我想如果字符串返回正确的字符串大小:EEE RRR:它应该返回7但这回200总是数字符串长度c

+0

未定义的短字符串行为。你为什么认为从200开始向后倒数会起作用? –

+0

如果你传递了一个长度为7的字符串,你需要什么,为什么要在'str [200]'做什么? – nos

+2

一定是个巨魔吧? –

回答

0

你可以用这个来代替一个。它更简单

int string_length(char *str) 
{ 
    int i =0; 
    while(*str++) i++; 
    return i; 
} 

,并因为字符串的边界外的数据传递的是随机的,大多没有'\0'您可以使用预定义功能strlen()#include <string.h>

+0

string_length(NULL)和SIGSEGV – jacekmigacz

+4

@jacekmigacz甚至从'#include '的'strlen()'和'strcmp()'不会使NULL指针的检查。他可以在功能之外进行检查。 'if(str){len = string_length(str); }' – MOHAMED

+0

MOHAMED:肯定!,那是user2426801的注释让他知道 – jacekmigacz

2

它。

决不访问数组出界,它会导致未定义的行为。如果你想创建自己的功能,你需要从头开始。

strlen有什么问题?

0

尽可能地坚持你原来的代码

  • 此功能从0向上......没有200减计数。当它发现一个字符串终止,不为NULL
  • 此函数结束


int string_length(char str[]) 
{ 
    int i; 
    for(i=0; i<200; ++i) 
    { 
     printf("[%d] : %c \n", i, str[i]); 
     if(str[i] == '\0') 
     { 
      return(i); 
     } 
    } 
} 

或者,如果你想有一个最低限度的功能:

int string_length(char* s) 
{ 
    return (*s)? string_length(s+1)+1 : 0; 
} 
+0

如果你传递一个长度为201的字符串会发生什么?你不会迎合每一条返回路线。 – RobbieE

+1

@RobbieE:正如我明确指出的那样,这是为了尽可能地贴近海报的原始代码,包括他的限制和设计选择。 – abelenky

+0

如果两个字符串之间存在空格,aberlenky ur code不起作用 – kimchi

0

为什么你是从第200个角色开始的吗?您无法预先知道此内存地址是否已分配。您冒着程序崩溃的风险。与此相关的是,您不检查传入函数的字符串是否有效(检查它是否具有非空地址)

相反,从索引0开始并继续工作。

在c/C++中,字符串的末尾标有'\ 0'字符。尝试寻找这个而不是NULL(除非你已经将NULL定义为'\ 0')