gpt4 book ai didi

c - C 编程语言 (K&R) ex1-20 。我遇到了一些麻烦

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:05 24 4
gpt4 key购买 nike

/*
* 1-20. Write a program detab that replaces tabs in the input with the proper number
* of blanks to space to the next tab stop. Assume a fixed set of tab stops, say every n columns.
* Should n be a variable or a symbolic parameter?
*
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 4

void detab(char **str);

int main(){
char *line=NULL;
char *newline;
int len;
while(getline(&line,&len,stdin)!=-1){
detab(&line);
printf("%s",line);
}
free(line);
return 0;
}
void detab(char **str){
int len=0,num=0;
int i=0;
char c;
while((c=(*str)[i])!='\0'){
if(c=='\t'){ // get the number of tab
num++;
}
len++; // get length of string
i++;
}
char *newline;
newline=(char *)malloc(len+(N-1)*num+1); //use four blank replace one tab
if(newline==NULL){
fprintf(stderr,"can't malloc space\n");
}
i=0;
int j=0; //index of newline
while((c=(*str)[i])!='\0'){
if(c=='\t'){
int k;
for(k=0;k<N;k++){
newline[j]=' ';
++j;
}
}
else{
newline[j]=c;
++j;
}
++i;
}
newline[j]='\0';
free(*str);
*str=newline;
}

当我输入一个短字符串时,它可以正常工作,但如果我输入一个可能有 50 个字符的长字符串,它会这样说:

*** Error in `./a.out': free(): invalid next size (fast): 0x0961b068 ***
Aborted (core dumped)

我已经被困在这里将近三个小时了。请帮助我。

它工作正常,如果我尝试使用单指针,就像这样:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 4

char* detab(char *str);

int main(){
char *line=NULL;
char *newline;
int len;
while(getline(&line,&len,stdin)!=-1){
newline = detab(line);
printf("%s",newline);
free(newline);
}
free(line);
return 0;
}
char* detab(char *str){
int len=0,num=0;
int i=0;
char c;
while((c=str[i])!='\0'){
if(c=='\t'){
num++;
}
len++;
i++;
}
char *newline;
newline=(char *)malloc(len+(N-1)*num+1); //use four blank replace one tab
if(newline==NULL){
fprintf(stderr,"can't malloc space\n");
}
i=0;
int j=0; //index of newline
while((c=str[i])!='\0'){
if(c=='\t'){
int k;
for(k=0;k<N;k++){
newline[j]=' ';
++j;
}
}
else{
newline[j]=str[i];
++j;
}
++i;
}
newline[j]='\0';
return newline;
}

最佳答案

我通过将每个输入行读入双向链表来解决问题 1_20。列表中的每个节点依次代表该行的一个字符。

创建链表后,我删除了列表末尾的空格,即从行尾。

然后我遍历链接列表,扫描选项卡,边走边记录列数。

当我遇到一个制表符时,我会标记它的列号并计算在下一个制表位之前我需要多少空格。公式为:

tabstop = ((col + (m-1)) / m) * m;

哪里:

  • tabstop 是下一个制表位
  • m 是制表位之间的距离
  • col 是制表符所在的列

我用一个空格替换制表符,并在链表中插入单个空格的新节点,直到到达下一个制表符为止。

我继续从制表位列开始遍历链表,搜索下一个制表符并重复转换过程。

一旦到达链表的末尾,我将其作为输出行打印出来。

使用双向链表可能看起来很繁琐,但它极大地简化了程序中main()函数的逻辑。

main() 函数说:

while (not end of file)
{
getline()
remove_final_white_space()
convert_tabs_to_spaces()
putline()
}

getline() 函数创建带有制表符的链表。

putline() 函数在一次打印一个字符的同时刷新链表。

关于c - C 编程语言 (K&R) ex1-20 。我遇到了一些麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com