Тема: Чому локальний string не знищується по закінченню функції
Привіт. Останнім часом вивчаю С.
Доволі затягнуло, цікава мова. Однак часом не зовсім можу зрозуміти логіку роботи string.
Іноді вдається накачити більш-менш адекватні пояснення. А от в одному випадку нічого не знайшов, тому вирішив спитати з конкретним прикладом.
Завдання з SoloLearn, називається Pig Latin. Суть така, що вводиться речення (string слів через пробіл), а програма має взяти кожне слово, перекинути першу літеру накінець і додати "ay", вивести перероблені слова в тому ж порядку.
Я завдання виконав:
#include <stdio.h>
#include <string.h>
char* latinize(char *word);
int main() {
char sentence[100];
char *token, *word;
const char delimiter[2] = " ";
fgets(sentence, 100, stdin);
sentence[strcspn(sentence, "\n")] = 0;
token = strtok(sentence, delimiter);
while( token != NULL ) {
word = token;
printf("%s ", latinize(word));
token = strtok(NULL, delimiter);
}
return 0;
}
char* latinize(char *word) {
static char latinized_word[50];
int len = strlen(word);
char buffer[50] = "";
char first;
for (int i = 0; i < len; i++) {
if (!i) {
first = word[i];
} else {
strncat(buffer, &word[i], 1);
}
}
strncat(buffer, &first, 1);
strcat(buffer, "ay");
strcpy(latinized_word, buffer);
return latinized_word;
}
Я розумію, чому не знищується latinized_word по закінченні функції (і кожне попереднє «латинізоване» слово додається), воно статичне.
Проте не розумію, чому коли я не «очищу» локальний string buffer (char buffer[50] = "";), то відбувається те саме, що зі статичною latinized_word. Тобто додає кожне попереднє слово.
Приміром.
input:
thing to keep in mind is that
годящий output:
hingtay otay eepkay niay indmay siay hattay
output якщо я вкажу просто char buffer[50]; без "" —
hingtay hingtayotay hingtayotayeepkay hingtayotayeepkayniay hingtayotayeepkayniayindmay hingtayotayeepkayniayindmaysiay hingtayotayeepkayniayindmaysiayhattay
Напевно це через те, що string це array, а array це pointer. Але хіба локальний пойнтер не очищується?
Якщо хтось пояснить на пальцях у такому стилі, буду вдячний.