2014-10-16 3 views
0

Я пытаюсь написать простую программу, которая считывает введенные пользователем строки в массив указателей. Чтение идет хорошо, однако, когда я хочу добавить дополнительный параметр к моему методу, чтобы сохранить количество строк, которые я действительно читаю, он перестает работать. Компилятор не очень полезен, поэтому я решил взять свою проблему здесь.C Чтение введенных пользователем данных

Фактический код:

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

void read(char**, int *); 
void write(char**); 

int main() { 
    int amount = 0; 
    int * amount_p = &amount; 
    char *pt_p[1000]; 
    read(pt_p,amount_p); 
    write(pt_p); 
} 


void read(char ** pt, int * amount) { 

    char stop[] = "STOP"; 
    char* woord; 
    int i = 0; 

    printf("Enter a word: "); 
    scanf("%70s", woord); 
    pt[i] = malloc(sizeof(char)*(strlen(woord)+1)); 
    pt[i] = strcpy(pt[i], woord); 

    i++; 

    while(strcmp(stop,pt[i-1]) != 0) { 
      printf("Enter a word: "); 
      scanf("%70s", woord); 
      pt[i] = malloc((strlen(woord)+1)*sizeof(char)); 
      pt[i] = strcpy(pt[i], woord); 
     i++;  
    } 
    *amount = i; 

} 

void write(char ** pt) { 
    int i = 0; 
    char stop[] = "STOP"; 
    while(strcmp(stop,pt[i]) != 0) {  
     printf("pt[%d]-> %s",i,pt[i]); 
     printf("X \n"); 
     i++; 
    } 

} 
+0

'char * woord;' -> 'char woord [71];' – BLUEPIXY

+0

Спасибо! Кажется, это исправить. Однако я не понимаю, почему. Когда я указываю char * woord, это не значит, что я могу ввести столько символов, сколько мне нравится, поскольку размер строки еще не определен. Потому что позже я просто выделил длину слова, чтобы зарезервировать достаточно места в pt [i]. Может ли быть так, что место памяти в памяти неизвестно? – Actaeonis

+0

Требуется область для хранения персонажа. – BLUEPIXY

ответ

2

вам нужно выделить некоторое пространство, в котором можно ввести строковое

char* woord; только декларирует указатель, который не указывает нигде в частности.

вместо объявим его как

char woord[128]; 

выделить 128 байт в стеке для вашего входного сигнала.

также использовать fgets() вместо scanf(), чтобы читать строки, таким образом вы можете запретить пользователю вводить слишком большую строку.

if (fgets(woord, sizeof(wooord), stdin) != NULL) 
{ 
    char* p = strchr(woord, '\n'); 
    if (p != NULL) 
    { 
    *p = '\0'; 
    } 
} 
+0

Спасибо! Это было действительно привлечено к моему вниманию, прежде чем этот фейс является более безопасным методом для этой операции, спасибо за напоминание. – Actaeonis