【问题标题】:Printing a CString prints unknown text before打印 CString 之前打印未知文本
【发布时间】:2019-07-07 15:43:06
【问题描述】:

不幸的是,此代码似乎在打印实际文本之前打印了一些内容。这是什么?为什么要打印?

"\300\367\277\357\376"

我在我的代码中更频繁地意识到这一点,我确信这意味着我做错了什么。

char* concat(const char *s1, const char *s2);
int main(int argv, char* args[]){
    char lastchars[50];
    char *buf;
    while(1){
        gets(lastchars);
        if(strlen(lastchars) == 0)break;
        buf = concat(buf, lastchars);
    }
    printf("%s",buf);
 }
 char* concat(const char *s1, const char *s2)
 {
    char *result = malloc(strlen(s1) + strlen(s2) + 1); 
    strcpy(result, s1);
    strcat(result, s2);
    return result;
 }

【问题讨论】:

  • concat的定义是什么?另外,为什么不使用标准的strcat
  • 你从未初始化buf,所以你得到了未定义的行为。
  • 另外,永远不要使用gets
  • char *buf; 之后 -- buf 指向什么有效内存? (提示:没有你拥有)

标签: c printf


【解决方案1】:

即使我们忽略了对不安全且不再受支持的函数 gets 的调用,这段代码也存在许多问题,从您的 concat 函数开始:

char* concat(const char *s1, const char *s2)
{
   char *result = malloc(strlen(s1) + strlen(s2) + 1); 
   strcpy(result, s1);
   strcat(result, s2);
   return result;
}

buf 未初始化时,您正在调用concat 行:buf = concat(buf, lastchars);。换句话说:

char *result = malloc(strlen(buf) + strlen(lastwords) + 1);
strcpy(result, buf);
strcat(result, lastwords);
return result;

strlen(buf) 是什么?这是未定义的行为,因为 buf 不包含带有空终止符的字符串。

那么,strcpy(result, buf) 也是未定义的行为,因为 buf 未初始化。

然后您返回result 并将其分配回buf

用这段代码很难解读你的意图,所以我无法提供解决方案 - 只能指出众多问题。

【讨论】:

  • 我其实用的是一本网络编程的书,代码是1999年写的。我以前从来没有用过C...很难一次学习网络编程(或者至少是标准的IO东西,到目前为止) ,学习 C 并区分旧 C 和新 C...旧 C 在那个时代没有得到很好的支持(基本上为什么应该...)我只是想将我输入的代码读入文件(练习)由于许多愚蠢的问题,最终我的溢出帐户很快就会被禁止...感谢您的回答!
  • 哪本 1999 年的网络教科书,@TVSuchty?你确定没有一个更新的可以更好地完成这项工作。你确定你复制的代码正确吗? (你输入的错误几乎不可能,但它不可能出现在一本一流的书中,即使是从那个时代。)
  • 否:我写了代码,试图提取讲座的精髓。这是一本德语书:amazon.de/…
  • 我的德语阅读能力不够好,无法评估这本书——对不起。我以前没听说过;我没有看到任何关于它的评论。如果这真的是它所说的,请谨慎,@TVSuchty。这可能是一个孤立的问题;这可能表明示例中存在其他问题。它在亚马逊得到了合理的评价,但这并不像任何人想要的那样可靠。
猜你喜欢
  • 2020-08-08
  • 2013-03-21
  • 1970-01-01
  • 2012-08-25
  • 2013-06-12
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多