2011-05-07 111 views
0

我想循环在按下“Enter”时中断。有什么建议么?C - 循环不会中断

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

#define len 20 
#define limit 100 

//Prototypes for functions 
int read_word(char str[], int n); 



int main(void) 
{ 
    char *p; 
    char word[len+1]; 
    int i=0, nwords = 0; 

//Loop for reading in words and allocating an array 
    for (;;) 
    { 
     if (nwords == limit) 
     { 
      printf("Insufficient Space\n"); 
      break; 
     } 
     printf("Enter word: "); 
     scanf("%c", &word); 
     p = (char*) malloc(nwords*sizeof(char)); 
     p[i]= read_word(word, len); 
     i++; 

     if (p == NULL) 
     { 
      printf("Insufficient Space\n"); 
      break; 
     } 
    } 

    for(i=0; i<nwords; i++) 
     printf(" %s\n", p[i]); 

    return 0; 

    } 
int read_word(char str[], int n) 
{ 
    char ch; 
    int i = 0; 

    while((ch = getchar()) != '\n') 
     if (i<n) 
      str[i++] = ch; 
    str[i] = '\0'; 
    return i; 
} 
+1

你在哪里测试按下Enter键? – 2011-05-07 10:08:47

+0

您也在使用它之后检查'NULL'的'p'指针太晚了。 – EFraim 2011-05-07 10:11:26

+0

我相信这是在read_word函数中。应该是while循环的控制表达式。 – Richard 2011-05-07 10:12:32

回答

1

scanf调用读取的第一个字符,然后你read_word功能将覆盖它。如果scanf调用读取换行符,它将被忽略。

的线条:

p = (char*) malloc(nwords*sizeof(char)); 
    p[i]= read_word(word, len); 

...也出现错误。 read_word返回一个整数(读取的字符串的长度),但是存储到一个char数组中。此外,您每次都通过循环为内存重新分配p,因此以前存储的值将会丢失。

要解决:

  • 变化p是一个int *,并且将其初始化为空
  • 变化malloc呼叫到合适的realloc
  • 除去调用scanf完全
  • 动议检查p == null之前赋值p =(char *)malloc(nwords * sizeof(char));'

或者:p意味着实际上是一个字符串(单词本身)的数组而不是字长?在这种情况下,必须:

  • 变化p是分配(使用malloc)存储用于每个字代替具有wordchar **
  • 变化的分配大小(对于realloc调用)nwords * sizeof(*p)
  • 是堆栈分配数组
  • 设置p[i] = word;而不是当前分配。
+0

所以通过将p改为一个int指针数组,我将能够将字符串存储到元素中,然后递增指针以访问它? – Richard 2011-05-07 10:29:30

+0

是的,我想将单词作为字符串存储到数组中,然后可以访问单个单词 – Richard 2011-05-07 10:31:31

+0

@Richard,no。要将字符串存储到元素中,元素类型应该是'char *'(或'char []')。查看我的(编辑)答案的最后部分。 – davmac 2011-05-07 10:32:08