2015-12-15 3 views
1

Вот мой код:C - Как читать строку с неизвестной длиной

int main() { 
    int i=0; 
    int size=1; 
    char *pntName=NULL;//a pointer to an array of chars. 
    pntName = (char*) malloc(size *sizeof(char));//allocate sapce for the first char. 
    while(pntName[size-1]!=':'){ 
     if(pntName!=NULL)//check the case couldn't allocate 
      printf("Error"); 
     else{ 
      if(i<size){//meaning there is space for new char. 
       scanf("%c",&pntName[i]); 
       i++; 
      } 
      else{//case we don't have enough space 
       size++; 
       pntName = (char*)realloc(pntName,(size)*sizeof(char));//reallocat space. 
       scanf("%c",&pntName[i]); 
       i++; 
      } 
     } 
    } 
     return 1; 
} 

я пытаюсь прочитать строку, которая содержит имя. Пользователь может вводить символы, пока он не введет ':'. Что случилось с моим кодом?

+2

С какой проблемой вы сталкиваетесь? – alk

+0

вы не должны приводить результаты malloc в c, также, пожалуйста, дайте нам некоторые неожиданные результаты, с которыми вы сталкиваетесь –

+0

И 'sizeof (char)' не может отличаться от '1'. Использовать это ерунда. – Olaf

ответ

5

Строка должна быть завершена с помощью '\0', поэтому допустим дополнительный символ. При перераспределении лучше использовать другой указатель в случае сбоя перераспределения.

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

int main(void) { 
    int i=0; 
    int size=1; 
    char *pntName=NULL;//a pointer to an array of chars. 
    char *temp=NULL;//a temporary pointer 

    pntName = malloc(size + 1);//allocate space for two char one for the '\0' to terminate the string 
    while(1){ 
     size++; 
     temp = realloc(pntName, size + 1);//reallocat space. 
     if (temp == NULL) { 
      printf ("error allocating memory"); 
      free (pntName); 
      return 1; 
     } 
     pntName = temp; 
     if ((scanf("%c",&pntName[i])) == 1) { 
      i++; 
      pntName[i] = '\0'; // terminate the string 
      if (pntName[i-1] == ':') { 
       break; 
      } 
     } 
     else { 
      break; 
     } 
    } 
    printf ("\n%s\n", pntName); 
    free (pntName);// release memory 
    return 0; 
} 
2

Ваш случай с ошибкой здесь проблематичен.

if (pntName != NULL) 
    printf("Error"); 

На первой итерации цикла перед любым входом был прочитан, pntName выделяется (набор для чего-то не равен нуля), поэтому состояние проходит ошибки и строка «Error» печатаются. Вы не продвигаетесь к тому, чтобы выйти из условия while, так что это повторяется бесконечно.

+0

Я исправил это, но у меня проблема, когда я печатаю строку, иногда она печатает другие значения после ':' – yairabr