2015-07-04 3 views
-5

Следующий метод slength дает мне бесконечный цикл (бесконечные выражения «привет»). Чтобы найти длину строки с нулевым завершением, что мне нужно, чтобы посмотреть, так как нет «\ 0» ?.Длина ненулевого завершенного символа char * array

int slength(const char *s) { 
printf("hello"); 
int i = 0; 
while (s != NULL) { 
    i++; 
    s++; 
    printf("hello"); 
} 
return i; 
} 

Этот метод, похоже, работает, но я считаю, что слишком много проверок для рассмотрения. Есть ли более простой способ?

int silength(const char *s) { 
    int i = 0; 
    while((*s>='a'&& *s<='z') || (*s>='A' && *s<='Z') || *s == ' ') { 
    i++; 
    s++; 
    printf("hello\n"); 
} 
return i; 
} 
+0

'' 'указатель a будет оценивать только' NULL' после обертывания (как 4-байтовое целое, если вы на маленькой системе, 8-байтовое целое, если вам действительно повезло - и готовы ждать какое-то время). – usr2564301

+1

Вы должны быть осторожны с строк с нулевым завершением, либо вы всегда должны заканчивать нуль, либо всегда иметь размер, который хранится для предотвращения переполнения. У вас большой риск с переполнением границ и уязвимостью. – MiltoxBeyond

+0

В ситуации, когда я не могу остановить завершение строки, какую проверку мне нужно использовать в цикле? –

ответ

2

Поскольку вы не используете стандартные строки C, а вместо этого хотите создать свой собственный тип строки, вы не можете использовать обычные методы C в цикле через строку. Я предлагаю вам создать такую ​​структуру данных, как

struct string { 
    const char *text; 
    int length; 
}; 

, который отслеживает длину строки. Loop, используя дополнительную информацию о длине. Вам, вероятно, придется создавать свои собственные версии многих стандартных функций библиотеки C, которые обрабатывают строки, а также функции преобразования и фабричные функции.

Вот несколько примеров реализаций строк в C, отслеживающие длина:

bstring Пол Се

Text из C DR Хэнсона Интерфейсы и Реализации

В противном случае, просто используйте строки с нулевым завершением, так как это значение по умолчанию в C. Например, строковые литералы заканчиваются нулевым символом.

0

Заменить while(s!=NULL) на while(*s!=NULL).

+0

Я верю, что это не сработает для массива с нулевым завершением. – Niko