Почему присвоение int (0) строковому индексу завершает цикл? - PullRequest
0 голосов
/ 21 сентября 2018

Это загадка, с которой я столкнулся.

Я не получаю ошибок при компиляции:

$gcc -Wall -Wextra -pedantic -std=c99

Не могли бы вы объяснить, почему это происходит в C?

Ожидается:

Распечатать индекс и символ в строке [i] и заменить

Вывод:

Если я попытаюсь переназначить str[i] до 0, это действует как разрыв для цикла for.

    char str[] = "this is only a test";
    for(int i = 0; i < (int)strlen(str); i++) {
        printf("str[%d] = %c\n", i, str[i]);
        if(str[i] == ' ') {
               str[i] = 0; 
        }
    }

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Ваша программа работает нормально (при условии, что вы включили string.h) - когда она находит пробел ' ' как символ, она устанавливает индекс ith на \0 икогда в следующий раз strlen вычисляет длину, он обнаруживает, что i<(int)strlen (он находит завершение в ранней позиции) нарушается, и цикл завершается.

Здесь вывод GCC безлюбое предупреждение / ошибка:

 str[0] = t
 str[1] = h
 str[2] = i
 str[3] = s
 str[4] =  

Единственное, что он не будет печатать всю строку, так как, когда вы найдете пробел, который вы заменяете, он будет нулевым завершением, в следующий раз условие strlen будет нарушено, и оно наступитвне цикла.

Для печати всей строки лучше использовать переменную и инициализировать ее длиной строки, а затем использовать эту переменную в качестве условия:

 unsigned length = strlen(str);
 for(int i = 0; i < length; i++)

Кроме того, вам не нужно вводить strlenвозвращаемое значение int.

0 голосов
/ 21 сентября 2018

Поскольку вы манипулируете строкой и постоянно вызываете strlen, у вас возникают проблемы.Помните, что условие завершения for оценивается каждый раз через цикл , а не один раз.

Чтобы исправить это:

size_t l = strlen(str); // Save the length once

for (int i = 0; i < l; i++) {
  // ...
}
...