我已经掌握了这个知识,这EOF是一个在文本文件末尾自动插入的特殊字符,以表明它的结束.但我现在觉得有必要对此作一些澄清.我检查了谷歌和维基百科页面,EOF但他们无法回答以下内容,并且没有确切的Stack Overflow链接.所以请帮助我:
我的书说二进制模式文件根据文件目录条目中存在的字符数来跟踪文件的结尾.(与具有特殊EOF字符标记结尾的文本文件形成对比).那么EOF二进制文件的上下文是什么?我很困惑,因为在以下程序中,我在二进制模式下!=EOF从.exe文件读取时成功使用了比较:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int ch;
FILE *fp1,*fp2;
fp1=fopen("source.exe","rb");
fp2=fopen("dest.exe","wb");
if(fp1==NULL||fp2==NULL)
{
printf("Error opening files");
exit(-1);
}
while((ch=getc(fp1))!=EOF)
putc(ch,fp2);
fclose(fp1);
fclose(fp2);
}
Run Code Online (Sandbox Code Playgroud)是EOF一个特殊的"角色"吗?或者它是一个条件为维基说,当计算机知道何时返回像一个特定值的情况-1(EOF我的电脑上)?这种"条件"的例子是当字符读取功能完成读取所有存在的字符,或者字符/字符串I/O功能在读/写时遇到错误时?
有趣的是,Stack Overflow标签用于EOF混合那些定义 EOF.EOF所述"在编程领域中的标签,EOF是一个字节序列(或一个字符),表示此后没有更多的内容." 虽然它在"约"部分也说过" 文件结尾(通常缩写为EOF)是计算机操作系统中不能从数据源读取数据的条件.数据源通常称为文件或流."
但我强烈的感觉EOF不会是一个角色,因为在I/O期间遇到错误时,其他所有函数似乎都会返回它.
如果你能为我解决这个问题,那将是非常好的.
memcpy()和之间有什么重大区别strncpy()?我问这个是因为我们可以轻松地改变strncpy()以复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char*参数转换char*为第三个参数,并将第三个参数更改为非char类型的大小的倍数.在下面的程序中,我已经成功地使用它来将整数数组的一部分复制到其他程序中,并且它的效果一样好memcpy().
#include <stdio.h>
#include <string.h>
int main ()
{
int arr[2]={20,30},brr[2]={33,44};
//memcpy(arr,brr,sizeof(int)*1);
strncpy((char*)arr,(char*)brr,sizeof(int)*1);
printf("%d,%d",arr[0],arr[1]);
}
Run Code Online (Sandbox Code Playgroud)
同样,我们可以使其适用于float其他数据类型.那么有什么重大区别memcpy()呢?
PS:另外,我想知道为什么memcpy()在string.h头文件中,几乎所有的库函数都与字符串有关,而memcpy()在本质上更通用.任何原因?
如果我continue在while循环中使用它,为什么它会进入无限循环,但在for循环中工作正常?如果我之后使用它,
循环计数器增量i++会在while循环中被忽略continue,但如果它在for循环中则可以工作.
如果continue忽略后续语句,那么为什么不忽略for循环的第三个语句,它包含计数器增量i++?不是的第三条语句for循环随后到continue也应该被忽略,给出的第三个语句for执行循环后的循环体?
while(i<10) //causes infinite loop
{
...
continue
i++
...
}
for(i=0;i<10;i++) //works fine and exits after 10 iterations
{
...
continue
...
}
Run Code Online (Sandbox Code Playgroud) 我真的需要帮助.它已经动摇了我在C.Long的基础,我将非常感谢详细的答案.我把我的问题分成两部分.
答:为什么printf("%s",(char[]){'H','i','\0'});工作和打印Hi方式与传统方法printf("%s","Hi");一样?我们可以用(char[]){'H','i','\0'}它来代替"Hi"我们C代码中的任何地方吗?它们的含义是否相同?我的意思是,当我们用"Hi"C语言编写时,它通常意味着Hi存储在内存中的某个地方,传递给它的指针.可以说是看似丑陋的.(char[]){'H','i','\0'}他们完全一样吗?
B:当printf("%s",(char[]){'H','i','\0'})工作成功时,printf("%s","Hi")为什么然后printf("%s",(char*){'A','B','\0'}失败大时间和seg-fault如果我运行它尽管有警告?它让我感到惊讶,因为在C中,不char[]应该分解成char*,就像我们在函数参数中传递它一样,为什么它在这里没有这样做并且char*给出失败?我的意思是,不是char demo[]作为参数传递给功能相同char demo*?为什么结果在这里不相同?
请帮我解决这个问题.我觉得我还没有理解CI非常失望的基础知识.谢谢!
该%n格式说明,在使用时scanf(),预计用于存储已经由所述功能处理成类型的参数的格式字符串的字符数的计数int*.据定义:
The number of characters of the format string already processed is stored in the pointed location.
但是在我的程序中,除了第一个之外它scanf()在所有scanf()程序中都有效.在我的程序中的所有s中,不包括第一个,它存储从控制台输入的字符总数的计数,包括换行符(Enter键).但是在第一个中scanf(),计数 比从控制台输入的字符和换行总数少一个.
请解释这个异常,因为我无法检测到这个简单的bug真的很令人沮丧.
#include <stdio.h>
int main ()
{
int a,b,c,d,count;
printf("First Trial\n");
scanf("%d%d%d%d%n",&a,&b,&c,&d,&count); //OUTPUT ANOMALY HERE
printf("count=%d\n",count);
printf("Second Trial\n");
scanf("%d%n",&a,&count);
printf("count=%d\n",count);
printf("Third Trial\n");
scanf("%d%d%n",&a,&b,&count);
printf("count=%d\n",count);
printf("Fourth Trial\n");
scanf("%d%n%d",&a,&count,&b);
printf("count=%d",count);
}
Run Code Online (Sandbox Code Playgroud)
样本输出
First Trial
253
34
4
83
count=11
Second Trial
25
count=3
Third Trial
234 …Run Code Online (Sandbox Code Playgroud) scanf(),%[-A-B234abc]或的正确扫描集格式说明符语法是什么%[A-B234abc-]?我在 StackOverflow 上找不到答案,以下两个链接给出了相互矛盾的答案:
cplusplusreference: 不是第一个字符的破折号 (-) 可能会在某些库实现中产生不可移植的行为。
beez: 要匹配连字符,请将其作为集合中的最后一个字符:%[AC-]。
现在,根据我的理解,extern在声明中name[]告诉编译器它的定义是在其他地方(在我的程序中,我已经在我使用它的部分下面定义了它.)但是为什么然后有不同的后果strlen()和sizeof?strlen()工作正常,但sizeof()我得到错误:
invalid application of 'sizeof' to incomplete type 'char[]' |
这是我的计划:
#include<stdio.h>
#include<string.h>
extern char name[];
int main()
{
printf("%d,%d",strlen(name),sizeof(name));
}
char name[]="Bryan";
//char name[6]="Bryan"; //Neither of these make sizeof work
Run Code Online (Sandbox Code Playgroud)
我试图根据我对extern关键字的理解来推断它,但我遇到了瓶颈.所以请给出你的答案.
假设我的程序中有以下代码:
char *ptr;
ptr=malloc(sizeof(char)*10);
ptr=malloc(sizeof(char)*10);
ptr=malloc(sizeof(char)*10);
ptr=malloc(sizeof(char)*10);
Run Code Online (Sandbox Code Playgroud)
将一个指向同一个存储块被分配给ptr每一个时间,或存储器的独立件来每次保留和它的指针分配给ptr,导致内存泄漏每次malloc()被调用?
我还在学习C,所以如果它太基础我就忍受.我试着谷歌搜索,但没有找到答案.
编辑::
谢谢你的回答.请告诉我,如果我的这种方法处理内存泄漏风险.我的程序只需要5个人的名字并显示它,而不使用静态数组.阅读完你的答案后,我把它free(ptr)放在循环中,其他之前,我计划在循环之后只使用一次循环之后.我现在纠正了吗?
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main ()
{
char *names[5],*ptr;
int i;
for(i=0;i<=4;i++)
{
ptr=malloc(sizeof(char)*10);
printf("Enter name no.%d : \n",i+1);
scanf("%s",ptr);
names[i]=malloc(strlen(ptr)+1);
strcpy(names[i],ptr);
free(ptr);
}
for(i=0;i<=4;i++)
printf("%s\n",names[i]);
}
Run Code Online (Sandbox Code Playgroud) 我知道NULL指针是(void*)0.But当我们使用如下语句时会发生什么:
if(ptr==NULL)
Run Code Online (Sandbox Code Playgroud)
其中ptr可以是一个char,float或int指针?是NULL保证被隐式转换为左侧的类型,正如,例如,在C,类型通过返回malloc()是void*但隐式转换为左值的类型?
由于b++是后增量,b如果return b++在下面的程序中使用的增量会发生什么?
#include<stdio.h>
int foo(int);
int main()
{
int a=8;
printf("%d",foo(a));
}
int foo(int a)
{
static int b=a*a;
return b++;
}
Run Code Online (Sandbox Code Playgroud)
编辑
#include<stdio.h>
int foo();
int main()
{
foo();
foo();
}
int foo()
{
static int b=1;
printf("%d\n",b);
return b++;
}
Run Code Online (Sandbox Code Playgroud)
结果
1
2
正如我在编辑中看到的那样,为什么会b增加?不return应该立即退出该函数吗?为什么b即使在控制返回后也会增加main()?返回后,函数中的所有活动都不应该结束吗?