ниже - небольшое приложение C. Он попросит вас ввести слово. Он перестает спрашивать, когда достигло четырех уникальных слов. Но в приведенной ниже форме он не будет работать должным образом, пока вы не раскомментируете соответствующие строки.c while loop рассматривает локальную переменную в цикле как глобальную, почему?
#include <stdio.h>
#include <string.h>
#define WORDS_COUNT 4
int main()
{
char* words[WORDS_COUNT];
int words_added = 0;
while (words_added<WORDS_COUNT)
{
puts ("\n-------enter a word-------");
char response[250];
scanf("%s", response);
int i;
int duplicate_flag = 0;
for (i=0; i < words_added; i++)
{
if (strcmp(words[i], response) == 0)
{
duplicate_flag = 1;
break;
};
};
if (duplicate_flag == 0)
{
//char tmp[250];
//strcpy(tmp, response);
words[words_added] = response; //words[words_added] = tmp;
puts("that's new!");
words_added ++;
} else {
puts("you've said that already...");
};
};
return 0;
};
Основное различие, как вы можете видеть между words[words_added] = response
и words[words_added] = tmp
.
Зачем нужна переменная tmp
, а не response
?
Я предполагаю, что response
будет иметь одинаковый адрес на каждой итерации, а tmp
получит новый адрес на каждой итерации. но почему? но они оба были объявлены в том же цикле while?
Код плохо поврежден и выставляется неопределенное поведение. Ваша проблема в том, что вы не назначили постоянное хранилище для списка существующих слов - только указатели на них. – dmckee
[вы не хотите, чтобы ваша программа была точкой входа для переполнения буфера] (http://stackoverflow.com/a/456312/1025391)! – moooeeeep
@moooeeeep, который был бы немного параноиком здесь, это всего лишь небольшой фрагмент кода кода, но точка взята ;-) –