c - 在 C 中读取和打印 *char 字符串时的一个特殊错误

标签 c string pointers

我刚刚遇到了一些非常奇怪的事情。当我打印它时,我的 char 字符串(我们称它为 word )结果有额外的字母。
连接的字母取决于:

  1. 正确前缀词的长度。
  2. 单词后的空格数。

我正在解析 word来自line这只是标准输入的一行。我正在使用函数 readWord得到word来自 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.

最佳答案

永远不要相信您的输入,因此请检查单词开头的空格。

正如@rpattiso 指出的那样,您将单词增加了太多。

我对你的内存分配有疑问(你没有向我们展示你所有的代码): root.word = (char *)malloc(sizeof(char *)); 为指向 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;
}

关于c - 在 C 中读取和打印 *char 字符串时的一个特殊错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805870/

相关文章:

c++ - 如何将一个窗口的客户区复制到另一个窗口?

c++ - 未成功分配给指针

c++ - std::map 中的对象指针在通过 getter 检索时损坏

c++ - pthread_create 参数函数指针

javascript - 如何使用正则表达式匹配所有表情符号的 '\u' 代码?

regex - 如何将正则表达式匹配到字符串末尾?

c - 右值存储在c中的哪里?

c - MQL5 删除或减小趋势线的点大小

cURL - 将输出放入变量?

javascript - substr 给出错误的值 - javascript