说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

行后去空格 就这么难么

编辑:说三道四文库 发布时间:2018-02-24 12:14
HTML文档下载 WORD文档下载 PDF文档下载
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
FILE * f =  fopen ("one.txt","r");
FILE * s =  fopen ("two.txt","a+");
char sz [10000] = {0};
while(fgets(sz,10000,f))

for(int i = strlen(sz)-1; i>= 0; i--)
{
if(sz[i] != ' ')
{
sz[++i] = '\0';
break;
}
}
fprintf(s,"%s",sz);
memset(sz,0,sizeof(sz));
}
return 0;
}


怎么还是原样输出到文件里面,竟然没作用,求解
for(int i = strlen(sz)-1; i>= 0; i--)
        {
            if(sz[i] != ' ')
            {
                sz[++i] = '\0';

                break;
            }    
        }


找到的是i,替换的是++i,也就是i的下一个
而且'\0'表示的是字符串结尾
引用 1 楼 hua_yang 的回复:
C/C++ code
for(int i = strlen(sz)-1; i>= 0; i--)
        {
            if(sz[i] != ' ')
            {
                sz[++i] = '\0';

                break;
            }    
……
 你看错了 sz[i] != ' '   不是空格的地方怎么可以用0来代替  难道去空格不是以'\0'直接来结束么
 FILE * s =  fopen ("two.txt","w");
没看懂
#include<iostream>
using namespace std;

int main()
{
    FILE * f =  fopen ("text3.txt","r");
    FILE * s =  fopen ("two.txt","a+");
    char sz [10000] = {0};
    int i;
    while(fgets(sz,10000,f))
    { 
        for( i= strlen(sz)-1; i>= 0; i--)
        {
            if(sz[i] != ' '&&sz[i] != '\n')
            {
                break;
            }    
            sz[i] = '\0';
        }
        sz[i+1] = '\n';
        fprintf(s,"%s",sz);
    }
    return 0;
}

不知道这个是不是楼主想要的,楼主看看
补充一下
#include<iostream>
using namespace std;

int main()
{
    FILE * f =  fopen ("text3.txt","r");
    FILE * s =  fopen ("two.txt","a+");
    char sz [10000] = {0};
    int i;
    while(fgets(sz,10000,f))
    { 
        for( i= strlen(sz)-1; i>= 0; i--)
        {
            if(sz[i] != ' '&&sz[i] != '\n')//找到最后一个不是空格的地方
            {
                break;
            }    
            sz[i] = '\0';//把是空格的都改成结束符
        }
        sz[i+1] = '\n';//结尾加个回车
        fprintf(s,"%s",sz);
    }
    return 0;
}
比如sz[]="ABC  \n"
那么sz[]={'A','B','C',' ',' ','\n','\0'}
strlen(sz) = 5
sz[5] = '\n' != ' '
所以你的循环只执行了一次就结束了。
恩,写错了,strlen(sz) = 6,strlen不计算\0。但是因为数组下标是从0开始,所以正好是最后一个字符‘\n’。
strlen(sz) = 6
sz[6 - 1] = '\n' != ' '
引用 6 楼 questionfish 的回复:
补充一下

C/C++ code
#include<iostream>
using namespace std;

int main()
{
    FILE * f =  fopen ("text3.txt","r");
    FILE * s =  fopen ("two.txt","a+");
    char sz [10000] = {0};
    int i;……

不小心把源文件改了。。。楼主注意再改成自己的源文件
1111111111111111111111111111111111111111111111
自己去查一下 fgets 函数的说明。上面清楚有写,该函数获取一整行字符,包含行尾的换行回车符,一块放到输入的 buffer 中。

换句话说,你的代码,执行过程中,对空格符的判断只有两种情况可能生效:
1. 整个文件末尾有空格无换行;
2. 一行字符数超过尺寸,且捕获的最后一个字符刚好是空格。

这不符合你所期待的结果。
楼主在 :
fprintf(s,"%s",sz);
后面加上:
fflush(s);

将字符串,刷新到s.
那这些空格前面有空格么?没有的话可以找到第一个空格的位置,然后把那个空格替换成'\0'
#include <stdio.h>
#include <string.h>
char ln[10000];
FILE *fi,*fo;
int i,L;
void main() {
    fi=fopen ("one.txt","r");
    if (NULL==fi) {
        printf("Can not open file one.txt!\n");
        return;
    }
    fo=fopen("two.txt","w");
    if (NULL==fo) {
        fclose(fi);
        printf("Can not create file two.txt!\n");
        return;
    }
    while (1) {
        if (NULL==fgets(ln,10000,fi)) break;
        L=strlen(ln)-1;
        if ('\n'==ln[L]) {
            ln[L]=0;
            if (L>0) {
                i=L-1;
                while (1) {
                    if (' '!=ln[i] && '\t'!=ln[i]) {
                        i++;
                        break;
                    }
                    if (i<=0) break;
                    i--;
                }
                ln[i]=0;
            }
            fprintf(fo,"%s\n",ln);
        } else {
            fprintf(stderr,"Warning: Line too long(>10000 characters).\n");
            fprintf(fo,"%s",ln);
        }
    }
    fclose(fo);
    fclose(fi);
}
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘