2012-04-29 3 views
-1

У меня вопрос простой: пусть пользователь вводит несколько слов с клавиатуры, по одному слову на строку, до символа '.' (Период) Введенный затем распечатать результат, например:массив символов в C

Enter a word: word1 
Enter a word: word2 
Enter a word: . 
You have entered 2 word(s): 
word1 
word2 

OK здесь мой попробовать, но когда я бегу он сказал файл перестал работать после того, дайте мне ввести первое слово

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char *word[50]; //each word has maximum 49 character 
    int i=0, number_of_word; 

    do 
    { 
     printf ("Enter a word: "); 
     scanf("%s", &word[i]); 
     i++; 
    } 
    while (word[i][0]!='.'); 

    number_of_word =i; 
    printf ("You entered %d word(s):\n", number_of_word); 
    for (i=0; i<number_of_word; i++) 
    { 
     printf("%s\n", &word[i]); 
    } 

    return 0; 
} 

--- -------------------------------------------------- ------------------

EDIT 1:

OK Я стараюсь это, он работал, но я до сих пор Лоо king для лучшего способа объявить массив неизвестных размеров символьной строки, так как я не знаю ни того, сколько слов пользователя может ввести, ни сколько букв каждого слова, на C++ он может называться динамическим массивом распределения, я понятия не имею, как это сделать это в C

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char word[20][50]; //array has maximum 20 words, each word maximum 50 character 
    int i=0, number_of_word; 

    do 
    { 

     printf ("Enter a word: "); 
     scanf("%s", word[i]); 
     i++; 
    } 
    while (word[i-1][0]!='.'); 

    number_of_word =i-1; 
    printf ("You entered %d word(s):\n", number_of_word); 
    for (i=0; i<number_of_word; i++) 
    { 
     printf("Word %d is %s\n", i, word[i]); 
    } 


    return 0; 
} 

ответ

5

Вы не назначаете любую память для хранения отдельных строк, так что ваша программа вызывает неопределенное поведение.

Это:

char *word[50]; 

определяет массив из 50 указателей, но нет дальнейшего хранения.

И когда вы это делаете:

scanf("%s", &word[i]); 

вы пишете в указатель массива.

+0

ok любое предложение, как объявить массив, так как я не знаю ни того, сколько слов пользователя может ввести, ни сколько букв каждого слова –

0

При объявлении

char *word[50]; 

У вас есть 50 символов указателей, указывающих на оперативную память. То, что вы хотите что-то вроде этого:

char word[50][50]; 

Обратите внимание, что вы можете иметь только 49 слов («» и), и каждый из них может иметь менее 50 символов (не забывайте о \ 0, поэтому слово с 50 символами переполняется).

И вы хотите изменить свой Scanf вызов на что-то вроде:

scanf("%s", word[i]); 

Обратите внимание, что вам не нужно &, так как слово [я] уже указатель.

+0

, если я делаю char word [50] [50]; разве это не 2-мерный массив? Как я могу проверить, вводит ли пользователь «.»? это: слово [i] [0] == '.' ? –

+0

@ LongBodie Да, это 2-й массив. Вы также можете сказать, что это массив массивов символов или массив строк (поскольку строка представляет собой массив символов). Вы можете протестировать вход так, как вы делали: word [i] [0] == '.'. word [i] - это строка i, слово [i] [0] - это первый символ строки i. – fbafelipe

0
char *word[50]; 

У вас есть массив из 50 указателей. Вам нужен массив из 50 байтовых блоков. Сколько слов вы хотите прочитать? Если вы знаете максимум, вы можете выделить пространство заранее. Если вы этого не сделаете, вам нужно что-то вроде связанного списка строк, к которому вы можете добавить новый элемент при его чтении.

0

Его твой вызов printf. Не забудьте добавить символ конца \ 0 в конец слова. Printf при печати строк печатает все в массиве символов до тех пор, пока не прочитает символ конца. 0

BasicAlly ...Hos should printf знать, как долго это слово и когда он должен прекратить печать? (Сейчас он продолжается навсегда)

0

Вы ничего не сделали, чтобы выделить память для отдельных строк.

Char * word [50] просто объявляет указатель на один массив указателей на символ.

EDIT

Я попытаюсь проиллюстрировать это здесь с каким-то псевдо-кодом ... отформатированного код на телефоне практически невозможно :) Учитывая предшествующий символ * вход [50]:

char * nextString; 

bool entering=true; 

do{ 

nextString =calloc(50); 

// enter the string to nextString 

if (nextString[0] != '.'){ 

    input[i] = nextString; 

    i++; 

} else{ 

entering=false; 

} 
} 
}while(entering) 
+0

ok любое предложение, как объявить массив, так как я не знаю ни того, сколько слов пользователя может ввести, ни сколько букв каждого слова –

+0

Вам нужно будет объявить что-то с некоторыми ограничениями заранее, например char [50] [100] и добавить проверки, чтобы избежать превышения границ. Написание символов непосредственно в нераспределенной памяти - это проблема со слова go. –

+0

PLS снова проверяет мой вопрос, я отредактировал, но все еще не могу нормально работать –

1
#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    char *word[50]; //each word has maximum 50 word 
    char enter_word[50];//maximum 49 character 
    int i=0, number_of_word; 

    while(1){ 
     printf("Enter a word: "); 
     scanf("%49s", enter_word); 
     if(*enter_word == '.')break; 
     word[i++]=strdup(enter_word); 
    } 

    number_of_word = i; 
    printf ("You entered %d word(s):\n", number_of_word); 
    for (i=0; i<number_of_word; i++){ 
     printf("%s\n", word[i]); 
    } 

    for(i=0;i<number_of_word; ++i) 
     free(word[i]); 

    return 0; 
} 
0

"char * word [50]" ничего не сделали, чтобы выделить память для отдельной строки. , вы должны выделить его, используя функцию alloc

0

Вы просто попытаетесь использовать «% [^ \ n]» место «% s» в scanf().

потому что «% s» хранит символы, пока не найдет первое место в строке.

попробовать это с вашим первым попросил программы

мая его помощь вам.

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