如何调试这个c代码
见视频- 好的,我正在写这个程序,它打印最后n行输入。n是命令行参数,默认值为10如何调试这个c代码,c,string,pointers,char,free,C,String,Pointers,Char,Free,见视频- 好的,我正在写这个程序,它打印最后n行输入。n是命令行参数,默认值为10 #include <stdio.h> #include <stdlib.h> #include <string.h> char line[500]; int pos = 0; void copy(char* tailed[], int n){ if(pos == n){ // moving contents of array to one pos
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char line[500];
int pos = 0;
void copy(char* tailed[], int n){
if(pos == n){
// moving contents of array to one position back
for(int i=0; i<pos-1; i++)
tailed[i] = tailed[i+1];
//free(tailed[pos-1]); not working
pos--;
}
tailed[pos++] = strcpy(malloc(strlen(line) * sizeof(char)), line);
}
int main(int argc, char* argv[]){
if(argc > 2){
printf("[*]Error");
return 0;
}
int n = argc==2 ? atoi(argv[1]) : 10, c;
char* tailed[n];
while(scanf("%[^\n]%*c", line) != EOF){
copy(tailed, n);
}
for(int i=0; i<pos; i++)
printf("%s\n", tailed[i]);
}
#包括
#包括
#包括
字符行[500];
int pos=0;
无效副本(字符*尾部[],整数n){
如果(pos==n){
//将数组内容移回一个位置
对于(int i=0;i 2){
printf(“[*]错误”);
返回0;
}
int n=argc==2?原子(argv[1]):10,c;
字符*尾[n];
而(扫描频率(“%[^\n]%*c”,第行)!=EOF){
副本(带尾,n);
}
对于(inti=0;i,您至少可以通过创建一个太短的缓冲区来进行调用,以接受随后写入的内容
该行:
tailed[pos++] = strcpy(malloc(strlen(line) * sizeof(char)), line);
除了非常非常规之外,它还将目标缓冲区缩短了1,并且应该是:
tailed[pos++] = strcpy(malloc(strlen(line) * sizeof(char))+1, line);
^^
strlen(…)返回当前占用缓冲区的字符数,但不包括\0字符。如果要为新缓冲区分配内存,该缓冲区需要足够大以包含相同大小的字符串,则需要在malloc语句中包含+1 to size以允许空终止。始终
作为说明,当我在我的系统上运行您的原始代码时,我得到以下运行时指示:
一旦我添加了+1
,它就会正常工作,没有任何运行时错误
顺便说一句,在Google中输入结果非常好…我清除了错误的字符串。free(tailed[0])正在工作。简单的回答是告诉您查看调试器并手动执行代码。这是一项非常有用的技能,您应该尝试一下。我注意到一件小事:您声明了一个int,c
,然后再也不使用它。您似乎在自动分配它之前释放了一些内容…这可能是您的问题?在复制函数中,您可以可能在malloc之前使用free。strlen(…)
返回当前占用缓冲区的字符数,但不包括\0
字符。如果要为新缓冲区分配内存,该缓冲区需要足够大以包含相同大小的字符串,则需要在malloc语句中包含+1
以调整大小,以允许空终止。始终如此。@ryker谢谢你,你也是对的。但是我清除了错误的字符串,这就是为什么我得到了错误的输出。