2012-01-19 57 views
0

我需要得到一个字符串不求回报的长度, 创建100字符的缓冲区,满我做一个realloc的添加空间,在一个char字符串Ç分配一个字符串,不知道的字符数

这是我的代码的结束......你能帮助我吗?

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

int main(int argc, char **argv) 
{ 
    char *content = malloc(10*sizeof(char)); 
    char c; 
    content[0]='\0'; 

    while ((c = getchar()) != EOF) 
    { 
     if (strlen(content) < 10){ 
      strcat(content, &c); 
      content[strlen(content)+1] = '\0'; 
     } 
     else { 
      content=realloc(content,sizeof(char)*(strlen(content))+2); 
      strcat(content, &c); 
      content[strlen(content)+1] = '\0'; 
     } 
    } 
    printf("%s",content);  

    return 0; 
} 
+0

什么问题?你有没有试过这段代码?也许它已经是正确的了? –

+0

一旦你超过10个字符,你会为每个字符读取一个'realloc' ... – Lindydancer

+0

为什么不使用scanf或获取。 – riship89

回答

2

这里的几个问题:

  1. 使用strcat那样!您应该传递一个指向终止字符串的指针,而不是指向单个字符的指针。这只是偶然的作品。
  2. 保持在一个单独的变量轨道分配的存储器的大小,而不是使用strlen()
  3. 使用另一种单独的变量,而不是通过调用strlen()不断跟踪的位置的字符串英寸循环完成后,设置终止\0一次。
  4. 更好的再分配的策略是在块增长的内存分配,即不是每一个字节。每当您分配的内存耗尽时,您可以分配X个字节,或者您可以将分配的字节数加倍。
0

你应该做的@cnicutar建议:

content[index] = c; 

此外,还有在你的代码的另一个问题。当您将“c”连接到“content”时,您将覆盖“content”末尾的'\ 0'。记住strlen会查找'\ 0'。

的另一个问题是:

content[strlen(content)+1] = '\0'; 

当你的strlen是9,你会在内容[10]被放置 '\ 0'。你已经分配了大小为10的“内容”,所以它意味着它从内容[0]到内容[9]。

简单

content[strlen(content)] = '\0'; 

应该做你想要什么。

+0

关于“覆盖\ 0”,'man strcat'说'strcat()和strncat()函数将空终止的字符串s2的副本追加到空终止的字符串s1的末尾,然后添加终止\ 0' – mvds

相关问题