2016-02-05 3 views
-4
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char *input[1000]; 
    char *word; 
int i = 0; 
while (scanf("%s", word) != EOF) 
{ 
    input[i] = word; 
    i++; 
} 
printf("%s ", input[0]); 
printf("%s ", input[1]); 
printf("%s ", input[2]); 
} 

например, если вход «My name is», выход будет «is is is» в отличие от «My name is». Может ли кто-нибудь указать, где в моем коде неправильно.Не знаете, почему члены массива символов неправильно печатаются в C

+0

Или, может быть, что это лучший способ, чтобы закодировать программу, которая читает серию слова из stdin и хранит его в массиве? –

+1

Это тест? Потому что [вопрос с точно таким же кодом] (http://stackoverflow.com/questions/35218216/can-anyone-please-explain-how-the-following-loop-executes) просто удален. – juanchopanza

+0

нет, его куча вопросов практики –

ответ

0

Вы не выделили памяти для word. Код вызывает неопределенное поведение. Выделяют некоторую память, как это:

int stringSize = 10; 
char *word = malloc(sizeof(char)*stringSize); 

или

char word [10]; 
+0

Хорошо, я понимаю, что вы имеете в виду. Как я могу исправить это, чтобы получить желаемый результат? –

+0

@OscarShum - см. Мои правки. – Sadique

+0

Все входы указывают на адрес памяти слова в настоящее время, правильно? –

3

Есть некоторые вопросы здесь, позвольте мне попытаться решить их

следующим вы объявляете массив символьных указателей но эти указатели не указывают нигде, или, скорее, это , указывающие везде ;-).

char *input[1000]; 

теперь вы объявить указатель, который оставил неинициализированным, указывает где-нибудь

char *word; 

теперь вы чтения с клавиатуры, используя неинициализированную указатель

while (scanf("%s", word) != EOF) 

Что вам нужно сделать, выделить память за то, что вы читаете

Сначала у вас есть временный буфер для чтения из клавиатура

char word[100]; 

Теперь при чтении с клавиатуры скопировать содержимое слова и выделить памяти для содержимого.

input[i++] = strdup(word); 

Не забудьте освободить память, вход [] указывают также, это также хорошо, если вы инициализации ввода [] указатели, так что вы можете distringuish между используются указатели и указатели неинициализированным.

char* input[1000] = { NULL }; 
+0

И чтобы предотвратить переполнение буфера, ограничьте чтение слова, изменив% s на% 100s, см. Http://stackoverflow.com/questions/1621394/how-to-prevent-scanf-causing-a-buffer-overflow- in-c – Roalt

+0

@ Roalt yep, хорошая точка. лично я бы использовал fgets, потому что в любом случае это просто строки. –

0

слово является указателем на массив символов, который будет указывать на ваш первый вход «Мой» на первой итерации. Это означает, что:

word = "My"; 
input[0] = word; 
input[0] = "My"; //as word and input[0] now point to the same memory location 

Вы затем изменить значение, сохраненное в ячейку памяти, на которую указывает слово:

input[0] = word; 
word = "name"; 
input[1] = word; 

слово, как указатель не изменился, только значение, которое указывает изменилось. На вашей второй итерации:

input[0] = word = "name"; //as the memory location of word doesn't change 
input[1] = word = "name"; //any pointer set to word will point to the same char array 

Ваша третья итерация делает одно и то же, в результате чего ваш выход будет «есть есть есть».

Во-первых, вы должны определить слово с его собственным размером/память:

char word[64] = NULL; //arbitrary size that's bigger than your largest length word 

В этом примере вы можете использовать:

char input[5][64] = { NULL }; 

Но я бы предложил использовать динамически выделенной памяти для ввода позже ,

И это до вас, как вы скопировать содержимое слова в свой входной массив, но возможности включают в себя с помощью STRCPY:

int i = 0; 
while (scanf("%s", word) != EOF){ 
    strcpy(input[i], (const char*)word); 
    i++; 
} 
Смежные вопросы