2013-04-04 3 views
3

Я пытаюсь сделать условие для цикла for, где я должен сказать (c<wordlength), но я не уверен, как найти длину слова.Язык C, как найти длину слова в массиве 2d?

так позволяет сказать, что у меня есть arrary под названием ...

char shopping[10][10]={"BAGELS","HAM","EGGS"}; 

, что это правильный синтаксис, чтобы найти, что покупки [0] имеет 6 букв?

ответ

5

Правильный синтаксис

strlen(shopping[0]) 

Это возвращает значение типа size_t, который не включает терминатор NUL.

Подробнее см. man strlen.

Если вы используете strlen(unchanging_string) в качестве условия терминала для цикла, разумно вызвать его один раз перед циклом, а не называть его на каждой итерации.

Альтернативный способ цикла по характерам shopping[0] выглядит следующим образом:

char *s = shopping[0]; 
while (*s) { 
    /* (*s) is the current character */ 
} 
5
size_t len = strlen(shopping[0]); 

Примечания, однако, что вы не должны писать:

for (size_t i = 0; i < strlen(shopping[0]); i++) 

Это может привести к плохой работе на длинных струнах. Использование:

size_t len = strlen(shopping[0]); 
for (size_t i = 0; i < len; i++) 
+0

Не лучше ли было бы избежать петли for? 'strlen() + 1 должен дать длину вправо? –

+0

@ Koushik: это зависит от более широкого контекста; что вы действительно пытаетесь сделать. Вы можете создать случай для 'for (size_t i = 0; shopping [0] [i]! = '\ 0'; i ++)', а также решения, использующие 'strlen()'. Задний вопрос: «Как найти, что строка содержит 6 символов», и мой первый ответ - это именно то, как это сделать. В начальном вопросе указан цикл 'for'; Я предположил некоторые возможные конструкции цикла 'for' и рекомендовал вызывать' strlen() 'один раз, а не N раз. Без дополнительного кода в вопросе нелегко больше помочь. –

2

На самом деле shopping[0] имеет 7 символов один вы забыли \0 символ, который для окончания строки. Хотя strlen() дает вам длину строки, это число символов до \0.

strlen(shopping[0]) 

Но Total полукокс strlen(shopping[0]) + 1 = 7

В памяти ваша shopping[0] что-то вроде:

+----+----+----+---+---+----+----+----+---+---+ 
| 'B'| 'A' |'G'|'E'|'L'| 'S'|'\0'| 0 | 0 | | 
+----+----+----+---+---+----+----+----+---+---+ 
          ^`\0` also a char in shopping[0] 

Edit:

Как я снова прочитал ваш вопрос, вы говорите 6 письма So strlen(shopping[0] ) это вы г ответ дать вам 6.

Поскольку вы хотите цикл найти количество писем (полукокс в моем ответе Неправительственного «\ 0»), то называя strlen() бесполезно.Я хотел бы, что вы должны извлекать выгоду из нулевой строки завершения в C:

int num=0; 
for(num = 0; shopping[0][num]!='\0'; num++); 
printf("\n number of letters are %d\n",num); 

Я думаю, что другие ответы не хорошо, они используют STRLEN() нет необходимости. Если я что-то не хватает, пожалуйста, дайте мне знать

+2

Вам грозит переопределение строки. В стандарте C говорится (§7.1.1 «Определения»): «A_string_ - это непрерывная последовательность символов, заканчивающаяся и включающая первый символ . [...] Длина строки - это число байтов, предшествующих нулевому символу. Акцент, как в ISO/IEC 9899: 2011. –

+0

@JonathanLeffler Я не думаю, что мой ответ неверен, строки null «\ 0' завершены в C. Я не прав? –

+0

@ GrijeshChauhan 'shopping [0] [num] = '\ 0'' неверно. это должно быть равенство не присвоение –

1

Вы можете написать код, используя for петлю, чтобы найти размер каждого элемента в торговом массиве:

for(i =0;i<10;i++) 
{ 
    j=0; 
    while(shopping[i][j]) 
    { 
     j++; 
    } 
} 

где j будет возвращать размер каждый элемент массива магазинов.

+0

Было бы лучше использовать вложенные петли 'for'? Внутренний может быть: 'for (j = 0; shopping [i] [j]! = '\ 0'; j ++)'. Это получает все элементы управления на одной строке (и вы отбрасываете '! = '\ 0'', если хотите, хотя я предпочитаю явное сравнение). –

Смежные вопросы