删除前面空格的程序
Program to remove preceding whitespace
我正在开发一个程序,该程序应该从给定文件的每行文本中删除前面的空格和制表符(案例 b)。我从 stdin 读取了文件,我工作正常。但是,我遇到了一个我无法弄清楚的讨厌的段错误。当我在情况 b 中调用 strcat() 时会发生这种情况。基本上我在 case b 中尝试做的是遍历文本文件中的每一行(80 个字符),从该行中删除任何前面的制表符或空格,然后将这些行放回 finalText。谁能看到我哪里出错了?或者是否有更简单的方法?
这是我的代码:
int main(int argc, char* argv[]) {
int x = 0;
int i = 0;
int j = 0;
int y = 0;
int count = 1;
char *text = malloc(sizeof(char) * 1024);
char *finalText = malloc(sizeof(char) * 1024);
char buff[80];
while(fgets(buff, 80, stdin) != NULL){
strcat(text, buff);
}
while ((x = getopt(argc, argv, "bic:")) != -1){
switch (x){
case 'b':
for(; text[i] != EOF; i += 80){
char buff2[80];
char *buff3;
j = i;
y = 0;
while(j != (80 * count)){
buff2[y] = text[j];
y++;
j++;
}
buff3 = buff2;
while(*buff3 && isspace(*buff3)){
++buff3;
}
count++;
strcat(finalText, buff3);
}
printf(finalText);
break;
default:
break;
}
}
return 0;
}
首先在'b'
案例之前,还有一个问题。您已为 text
分配了 1024 字节。您从 stdin
读取的每一行都连接在 text
字符串处。如果从 stdin
读取的总字符数超过 1024 字节,您将收到分段错误。
对于 'b'
案例中的问题:
为什么要搜索 EOF
? EOF
不是一个字符,您的循环将继续递增 i
迭代,直到您收到分段错误。您只想迭代直到可以使用 strlen()
检索的字符串的末尾。
#include <stdio.h>
int main(){
char buff[80];
int n;
while(fgets(buff, sizeof(buff), stdin)){
sscanf(buff, " %n", &n);
if(n && buff[n-1] == '\n')//only whitespaces line.(nothing first word)
//putchar('\n');//output a newline.
fputs(buff, stdout);//output as itself .
else
fputs(buff + n, stdout);
}
return 0;
}
我正在开发一个程序,该程序应该从给定文件的每行文本中删除前面的空格和制表符(案例 b)。我从 stdin 读取了文件,我工作正常。但是,我遇到了一个我无法弄清楚的讨厌的段错误。当我在情况 b 中调用 strcat() 时会发生这种情况。基本上我在 case b 中尝试做的是遍历文本文件中的每一行(80 个字符),从该行中删除任何前面的制表符或空格,然后将这些行放回 finalText。谁能看到我哪里出错了?或者是否有更简单的方法?
这是我的代码:
int main(int argc, char* argv[]) {
int x = 0;
int i = 0;
int j = 0;
int y = 0;
int count = 1;
char *text = malloc(sizeof(char) * 1024);
char *finalText = malloc(sizeof(char) * 1024);
char buff[80];
while(fgets(buff, 80, stdin) != NULL){
strcat(text, buff);
}
while ((x = getopt(argc, argv, "bic:")) != -1){
switch (x){
case 'b':
for(; text[i] != EOF; i += 80){
char buff2[80];
char *buff3;
j = i;
y = 0;
while(j != (80 * count)){
buff2[y] = text[j];
y++;
j++;
}
buff3 = buff2;
while(*buff3 && isspace(*buff3)){
++buff3;
}
count++;
strcat(finalText, buff3);
}
printf(finalText);
break;
default:
break;
}
}
return 0;
}
首先在'b'
案例之前,还有一个问题。您已为 text
分配了 1024 字节。您从 stdin
读取的每一行都连接在 text
字符串处。如果从 stdin
读取的总字符数超过 1024 字节,您将收到分段错误。
对于 'b'
案例中的问题:
为什么要搜索 EOF
? EOF
不是一个字符,您的循环将继续递增 i
迭代,直到您收到分段错误。您只想迭代直到可以使用 strlen()
检索的字符串的末尾。
#include <stdio.h>
int main(){
char buff[80];
int n;
while(fgets(buff, sizeof(buff), stdin)){
sscanf(buff, " %n", &n);
if(n && buff[n-1] == '\n')//only whitespaces line.(nothing first word)
//putchar('\n');//output a newline.
fputs(buff, stdout);//output as itself .
else
fputs(buff + n, stdout);
}
return 0;
}