vc6编c的时候调用printf函数在调试时每次程序运行到printf函数行的时候,总会跳出对话框说找不到printf.c

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc6编c的时候调用printf函数在调试时每次程序运行到printf函数行的时候,总会跳出对话框说找不到printf.c相关的知识,希望对你有一定的参考价值。

问题补充:小弟是新手,在编一些简单的程序:用vc6.0编c语言程序的时候调用printf函数,运行的时候没什么问题,但在调试时,每次程序运行到printf函数行的时候,总会跳出一个对话框显示找不到printf.c,哪位朋友知道这是怎么回事么?代码如下:
#include<stdio.h>
display(int num[],int n)

int i;
for(i=1;i<=n;i++)
printf("num[%d]=%d\n",i,num[i]);

choice_order(int num[],int n)/*选择排序*/

int i,j,temp,p;
for(i=1;i<n;i++)

p=i;
for(j=i+1;j<=n;j++)

if(num[p]>num[j])
p=j;

if(p!=i)

temp=num[i];
num[i]=num[p];
num[p]=temp;



/*insert(int num[],int index,int place)//在NUM[]中在place位置插入NUM[INDEX]

int temp,i;
temp=num[index];
for(i=index;i>=place-1;i--)

num[i]=num[i-1];

num[place]=temp;

*/
insert_order(int num[],int n)//插入排序

int i,j,temp,m;
for(i=2;i<=n;i++)

for(j=1;j<i-1;j++)

if(num[i]<num[j])
//insert(num,i,j);

temp=num[i];
for(m=i;m<j;m++)
num[m]=num[m-1];
num[j]=temp;





/*upper_order(int num[],int n)

int i,j,temp;
for(i=1;i<n;i++)

for(j=i+1;j<=n;j++)

if(num[i]>num[j])

temp=num[i];
num[i]=num[j];
num[j]=temp;




*/
find(int num[],int n)/*二分法在NUM[n]中查找Number*/

int left=0,right=n,mid,number;
printf("\nfind:\n");
scanf("%d",&number);

while(left<=right)

mid=(left+right)/2;
if(num[mid]==number)

printf("number is find in position:%d\n",mid);
break;

if(num[mid]>number)
right=mid-1;
else
left=mid+1;


if(num[mid]!=number)
printf("number is not exist\n");


main()

int num[11]=0,23,90,9,25,16,100,110,120,130,140;

display(num,10);
insert_order(num,10);
//upper_order(num,10);
display(num,10);
find(num,10);



你怎么跟踪调试的?是不是用F11,那样是跟踪步入,当遇到printf这样的函数它也会步入,结果就进入了程序外的系统领空,由于找不到prinrf这个库函数的实现源文件就跟你要了

你只要在这样的地方按F10跟踪步过函数就好了
参考技术A 不光printf,所有库函数都会说找不到,因为它们已经做成库文件了,源代码没有保留。所以这时候你应该按F10跳步调试,不能按F11单步调试。

在 c 语言中调用函数时,啥时候应该添加“&”,啥时候不应该添加?

【中文标题】在 c 语言中调用函数时,啥时候应该添加“&”,啥时候不应该添加?【英文标题】:when should we add '&' and when we shouldn't while calling a function in c language?在 c 语言中调用函数时,什么时候应该添加“&”,什么时候不应该添加? 【发布时间】:2020-11-02 15:00:59 【问题描述】:

程序 A

void create(struct Stack *st) 

    printf("Enter Size");
    scanf("%d",&st->size);
    st->top=-1;
    st->S=(int *)malloc(st->size*sizeof(int));


int main()

struct stack st;
create(&st);
return 0;

程序 B - 对于程序 B,假设已创建一个链接列表,其中 first(声明为全局变量) 指向列表中的第一个节点。

struct Node 
 
 int data;
 struct Node *next;
*first=NULL;

void display(struct Node *p) 

while(p!=NULL)

 printf("%d ",p->data);
 p=p->next;

 

int main()

display(first);
return 0;

我的疑问是,为什么在程序 A 中调用 create 函数时,需要 & 运算符,为什么在程序 B 中调用 时不使用它显示功能。 create 和 display 函数都将指针作为参数。在调用函数时,您能举例说明 & 和 * 运算符之间的关系吗?提前致谢。

【问题讨论】:

当您有一个变量并且需要将指向该类型变量的指针传递给函数时,您可以使用&amp;。如果您已经有一个指向正确类型的指针,则不要使用&amp; &amp;x 允许获取 x 的地址,无论其用途如何,如果您需要获取 x 的值,请使用 x if你需要得到它的地址使用&amp;x 在第二个程序中,传递的变量已经是一个指针。它被定义为*first 当您将一些&amp; 作为arguments 发送到任何函数的parameters 时,应该有* 来保存&amp;。这只是关系。 【参考方案1】:

当您将一些&amp; 作为arguments 发送到任何函数的parameters 时,应该有* 来保存该&amp;,或者如果函数的parameters 中有任何*,您可以发送@987654328 @ 喜欢&amp;*。这只是关系。

程序 A:

void create(struct Stack *st) 

    printf("Enter Size");
    scanf("%d",&st->size);
    st->top=-1;
    st->S=(int *)malloc(st->size*sizeof(int));


int main()

struct stack st;
create(&st);
return 0;

您需要发送&amp;st,因为将&amp;st 发送到create() 可以让您访问存储st 的内存。如果您发送st——这只是内存位置的名称,st 的数据被存储在其中——作为create() 的参数,那只是将st 复制到struct Stack *st 和导致错误。而且你不能像scanf("%d", &amp;st-&gt;size);那样使用它的副本修改原始值,这就是为什么在第一个程序中你需要发送st的地址。

程序 B:

struct Node 
 
 int data;
 struct Node *next;
*first=NULL;

void display(struct Node *p) 

while(p!=NULL)

 printf("%d ",p->data);
 p=p->next;

 

int main()

display(first);
return 0;

你已经有了存储struct Node类型的data的内存地址,即first的值。这就是为什么您不需要在这种情况下执行display(&amp;first),只需复制first 并在display() 函数中使用它。

在调用函数时,你能举例说明 & 和 * 运算符的关系吗?

但您也可以像这样在程序 B 中执行display(&amp;first)

struct Node 
 
 int data;
 struct Node *next;
*first=NULL;

void display(struct Node **p) 

while(*p!=NULL)

 printf("%d ",(*p)->data);
 *p=(*p)->next;

 

int main()

display(&first);
return 0;

我希望上面给出的示例清楚地说明何时根据参数调用任何函数时使用*&amp;。注意,displaying data using &amp;first会修改*p=(*p)-&gt;next;first的地址,你的head指向链表的指针会丢失,所以这个例子只是为了演示。

【讨论】:

【参考方案2】:

无论 x 的类型是什么,&amp;x 允许获取 x 的地址,无论目标是什么。如果您需要获取 x 的值,请使用 x 如果您需要获取其地址,请使用 &amp;x

在第一个程序中给出st的地址允许create修改它,所以在main中从create变量st被修改了。

但是有:

void create(struct Stack st) 

    printf("Enter Size");
    scanf("%d",&st.size);
    st.top=-1;
    st.S=(int *)malloc(st.size*sizeof(int));


int main()

  struct stack st;
  create(st);
  return 0;

在这种情况下,createmainstcopy 上工作,然后返回到 main st

没有变化

什么时候做

scanf("%d",&st->size);

目标是读取int并将其记忆在字段size中,因为需要给出该字段的地址,所以&amp;st-&gt;size而不是st-&gt;size这给出了它的价值


在第二个程序中 first 已经是一个指针,这就是为什么 main 中的调用是 display(first); 而不是 display(&amp;first);,无论如何请注意 first 评估 NULL display 什么都不做,因为 (p!=NULL) 立即为假

当然,您也可以使用&amp;first 获得first 的地址,但在这种情况下,您会获得struct Node **,因此假设display(&amp;first); 必须更改显示void display(struct Node ** p),当然它的身体必须适应

【讨论】:

【参考方案3】:

如果您想更改函数中的原始对象而不是其副本,则必须通过引用传递它。在 C 中通过引用传递意味着通过指向对象的指针间接传递对象。

例如,如果在第一个程序中你会写

void create(struct Stack st) 

    printf("Enter Size");
    scanf("%d",&st.size);
    st.top=-1;
    st.S=(int *)malloc(st.size*sizeof(int));


int main()

struct stack st;
create(st);
return 0;

然后该函数将处理传递给该函数的对象 st 的副本。更改副本对原始对象没有影响。

在第二个程序中

struct Node 
 
 int data;
 struct Node *next;
*first=NULL;

void display(struct Node *p) 

while(p!=NULL)

 printf("%d ",p->data);
 p=p->next;

 

int main()

display(first);
return 0;

函数display 处理指针first 的副本。指针本身在函数中没有被改变。所以通过引用传递它是没有意义的。另一方面,指针指向的节点是通过引用传递的。所以编译器不会创建类型结构节点的对象的副本。如果需要,您可以更改函数中的指向节点。

【讨论】:

是的,我明白了。

以上是关于vc6编c的时候调用printf函数在调试时每次程序运行到printf函数行的时候,总会跳出对话框说找不到printf.c的主要内容,如果未能解决你的问题,请参考以下文章

Keil C51重定向printf到串口

c语言中线程怎么调试,最好有步骤,谢谢!!!

VC6.0的安装使用调试和快捷键

VC++ 6.0 怎么做工程设置,最好图解

c的signal函数

平均负载 启动服务 启动流程