在C中读取和打印* char字符串时的一个奇怪的错误

时间:2015-04-22 18:21:08

标签: c string pointers

我刚刚遇到了一些非常奇怪的事情。当我打印它时,我的字符串char(让我们称之为word)会有额外的字母。
联系函件取决于:

  1. 正确的前缀词的长度。
  2. 单词后面的空格数。
  3. 我正在从word解析line,这只是标准输入的一行。我使用函数readWordword中获取line

    void readWord(char **linePointer, char **wordPointer){
      char *line  = *linePointer;
      char *word = *wordPointer;
      while (!isEndOfLine(line) && isLowerCaseLetter(*line)){
        *word = *line;
        word++;
        line++;
      }
      word++;
      *word = '\0';
      printf("The retrieved word is: %s.\n", *wordPointer)
      *linePointer = line;
    }
    

    我的输入/输出看起来像这样(请注意我在处理readWord之后调用insert函数以及它们之间的空格:

    // INPUT 1 :
    insert foo
    insert ba      // several spaces after 'ba'
    // OUTPUT 2:
    The retrieved word is foo.
    The retrieved word is bas.
    
    // INPUT 1 :
    insert foo
    insert ba      // several spaces after 'bar'
    // OUTPUT 2:
    The retrieved word is foo.
    The retrieved word is bare.
    

    我在考虑是否正确分配*word,我猜我是这样做的:

    root.word = (char *)malloc(sizeof(char *)); //root is my structure
    

    此外,它不太可能与重新分配word字符串的某些错误有关,因为它在readWord()函数的开头是完全清楚的。

    感谢您的帮助。对我来说这确实是一个具有挑战性的错误,我不知道还能做些什么。

    更新

    事实证明,我实际上在分配/重新分配方面存在一些问题,因为:

    //INPUT
    insert foo//no spaces
      insert bar                //spaces here
    //OUTPUT
    word variable before calling readWord function: ' '.
    The retrieved word is foo.
    word variable before calling readWord function: 'insert foo
    '.
    The retrieved word is bare.
    

1 个答案:

答案 0 :(得分:3)

永远不要相信你的输入,所以检查空格是否可以转到单词的开头。

你增加了一个词,就像@rpattiso所说的那样。

我怀疑你的内存分配(你没有向我们展示你的所有代码): root.word = (char *)malloc(sizeof(char *));指针分配空间,但不为字符本身分配空间。 readWord可以做到这一点。

以下改编版应该有效(更新):

void readWord(char **linePointer, char **wordPointer){
    char *line  = *linePointer;
    int i;

    while (!isEndOfLine(line) && !isLowerCaseLetter(*line)) line++; // go to begin of word
    *linePointer= line;
    while (!isEndOfLine(line) &&  isLowerCaseLetter(*line)) line++; // go to end of word

    i= line - *linePointer;                     // allocate room for word and copy it
    *wordPointer= malloc((i+1) * sizeof(char));
    strncpy(*wordPointer, *linePointer, i);
    (*wordPointer)[i]= '\0;

    printf("The retrieved word is: %s.\n", *wordPointer);
    *linePointer = line;
}