【问题标题】:puts function gives garbage value in Cputs函数在C中给出垃圾值
【发布时间】:2014-06-20 13:15:07
【问题描述】:

我想使用指针将一个字符串复制到另一个字符串,并且我从 printf 函数获取垃圾值(一些未知字符)。它有什么问题? 输出是“复制字符串**”。在**得到一些未知字符的地方。

#include <stdio.h>
#include <conio.h>
void main()
{
   char *s="string for copy",*c,*temp;//temp is used to back the 
                                      //pointer on 1st position
   clrscr();
   while(*s!=NULL)
   {
     *c=*s
      c++;
      s++;
   }
      c='\0';
      c=temp;//back pointer to first position
      printf("String from c:);
      puts(c);
      getch();

}

【问题讨论】:

  • main 的返回类型始终为int*s!=NULL 是一个不好的比较:NULL 指针常量指向 char。完全放弃比较,这是多余的。正确的缩进对于快速阅读很重要。
  • 欢迎来到 SO。请阅读How to Askhelp center 了解如何提问,尤其是关于MCVE 的部分。我还建议阅读 How to Debug Small Programs 以更好地了解如何调试它。

标签: c


【解决方案1】:

您需要为 char * 变量分配内存。

另外,您永远不会为temp 分配值(或为其分配空间),但稍后在您的代码中分配c = temp。这意味着c 当前在内存中的任何位置都将被分配内存中位于temp 位置的任何位置。

【讨论】:

    【解决方案2】:

    cchar * 没有为其分配内存。所以引用它 - 读取它或写入它 - 是未定义的行为。

    在将字符复制到其中之前,使用malloc() 或其他函数为c 分配适当的内存。

    所以问题实际上并不在于您尝试使用puts() 进行打印,而是当您通过*c = *s 将字符复制到它时。


    malloc()以外的代码,如下修改

    ...
    //allocate memory for c
    temp = c;
    while(*s!='\0')
    {
       *c=*s
        c++;
        s++;
     }
     *c='\0'; //use *c 
      c=temp;
     ...
    

    【讨论】:

    • 输出是“复制字符串**”在**的地方它给出了两个未知字符。我得到了你的解决方案,但我怎样才能在同一个程序中解决它。谢谢
    • @user3454231 你是说你添加了 malloc 调用,现在你得到了一些有效的输出?
    • Andrew_cs,我说的是同一个程序的输出。如果输出完全正确,但在同一个程序的末尾添加了最后两个字符。所以如果 char *c 没有分配内存,那么如何打印字符串“复制字符串”?
    • @user3454231,正如我在回答中所说,如果没有分配,您的程序具有未定义的行为。未定义意味着任何事情都可能发生,您可能会得到正确的输出,也可能会崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多