标题:code blocks 写的不能运行 错误叫permission denied
只看楼主
Sornets
Rank: 2
等 级:论坛游民
帖 子:102
专家分:61
注 册:2012-11-22
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    int i,j,temp;
    char str[101];
    for (;;)
    {
        gets(str);
        for (i=0;; i++) //zheng xiang.
        {
            temp=isspace(str[i]);
            if (temp==0)
                break;
        }
        for (j=0;;)//qv kongbai fu
        {
            str[j]=str[i];
            i++;
            j++;
            if (str[j]=='\0')
            {
               // count=j;
                break;
            }
        }
        for (i=j-1;; i--)//ni xiang qv kongbai
        {
            temp=isspace(str[i]);
            if (temp==0)//目的:直到检测到非空字符返回假
            {
                str[i+1]='\0';
                break;
            }
        }
        printf("%s\n",str);
        if ((str[0]=='E') && (str[1]=='N') && (str[2]=='D') && (str[3]=='\0'))
            return 0;
    }
    return 0;
}


这是我今天又改了点,count好像白写了,我就删了,我做前测了下,isspace返回的是8和0,不是1和0,所以就一直用的!=8。

至于你写的。。。我就勉强读懂定义了些字符串什么的,我现在只会用三个循环还有些学过的函数,指针刚刚讲,我也没预习,所以课上听得不是很懂。

我希望逆向挨个读,掠过那些空白符,包括空格,但是它总是一上来就符合条件然后跳出循环了。
2012-12-09 00:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
因为你用的C编译器,C是以0为假,非0为真,非0有很多数,所以偶然地会是8,但并不总是8,你要做真假判断,只能用==0和!=0,不要跟特定数字比较。如果isspace()返回真,你只要if(isspace())就可以了,不用与什么数比较的,因为这个函数的含义就是给出逻辑值,没别的意义,故只要if()真假即可。

这样吧,如果你实在看不明白指针版本的,我明天发个数组下标版的给你看看,对比一下,就知道这里指针和下标不过是变换了一下写法格式而已。

这里不存在计数的。但题目给的例子暗藏了很隐蔽的陷阱,很少人意识到会出现全部是空字符的字符串(全部是空格之类字符)的可能,或者是空字符串(没有任何内容),往往会死在这个地方。

[ 本帖最后由 TonyDeng 于 2012-12-9 01:15 编辑 ]

授人以渔,不授人以鱼。
2012-12-09 01:08
Sornets
Rank: 2
等 级:论坛游民
帖 子:102
专家分:61
注 册:2012-11-22
得分:0 
回复 22楼 TonyDeng
嗯嗯  好的 谢谢你啊~~~·
2012-12-09 01:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
程序代码:
/*
Description
在C语言中,将ASCII字符集中的制表符('\t')、回车符('\r')、换行符('\n')、垂直制表符('\v')、换页符('\f')和空格字符(' ')称作空白符。

你的任务是读入每行字符串,去掉行首和行尾的连续空白符,但是在任意非空白符中间的空白符不要去除。

Input
输入为多行,每行为一个串(不超过100个字符),至某行输入的非空白符仅为“END”结束。

Output
输出为多行,为每行输入的去掉前后空白符的串。“END”也输出。

Sample Input
abcdefg
    12345678
XYZ
abc 123
   END
Sample Output
abcdefg
12345678
XYZ
abc 123
END
HINT

头文件ctype.h中有isspace函数对空白符进行检测,若一个字符为空白符之一则返回真。


Append Code

*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "my_tools.h"

int str_trim(char s[]);

int main(int argc, char* argv[])
{
    const char* filename = "Text.txt";
    const size_t max_length = 100;

    FILE* file;
    errno_t errno = fopen_s(&file, filename, "rt");
    if (errno != 0)
    {
        Pause("Data file open failure!");
        return 1;
    }
    while (!feof(file))
    {
        char buffer[max_length + 1];
        if (fgets(buffer, max_length, file) != NULL)
        {
            int result = str_trim(buffer);
            printf_s("%s\n", &buffer[result]);
            if (strcmp(&buffer[result], "END") == 0)
            {
                break;
            }
        }
    }
    fclose(file);

    Pause("Press any key to continue...");
    return 0;
}

/*
    功能:将一字符串去掉头尾指定的字符,返回编辑后的结果
    参数:s -- 需要编辑的字符串,将被修改,不能是常量
    返回:所需字符串的起始位置,是原字符串内部的一个下标
*/
int str_trim(char s[])
{
    if ((s == NULL) || (s[0] == '\0'))
    {
        return 0;
    }

    int Start = 0;
    int End = strlen(s) - 1;
    while ((s[Start] != '\0') && isspace(s[Start++]))
    {
        ;
    }
    if (s[Start--] != '\0')
    {
        while (isspace(s[End--]))
        {
            ;
        }
        s[End + 2] = '\0';
    }
    else
    {
        s[Start] = '\0';
    }
    return Start;
}

你不用理会前面读取文件的部分,那仅仅是我取代你手工输入数据的方法而已。关键是提取出来的那个函数,以及如何使用这个函数。

[ 本帖最后由 TonyDeng 于 2012-12-9 10:59 编辑 ]

授人以渔,不授人以鱼。
2012-12-09 10:56
Sornets
Rank: 2
等 级:论坛游民
帖 子:102
专家分:61
注 册:2012-11-22
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    int i,j,temp;
    char str[101];
    for (;;)
    {
        gets(str);
        for (i=0;; i++) //zheng xiang.
        {
            temp=isspace(str[i]);
            if (temp==0)
                break;
        }
        for (j=0;;)//qv kongbai fu
        {
            str[j]=str[i];
            i++;
            j++;
            if (str[j]=='\0')
            {
               // count=j;
                break;
            }
        }
        for (i=j-1;;)//ni xiang qv kongbai
        {

            if (isspace(str[i]))
            {
                i--;
            }
            else
            {
                str[i+1]='\0';
                break;
            }
        }
        printf("%s\n",str);
        if ((str[0]=='E') && (str[1]=='N') && (str[2]=='D') && (str[3]=='\0'))
            return 0;
    }
    return 0;
}

你的程序似乎只是写了个框架,我对i++,++i这块学的不是很好,所以只是看懂了一点思路,然后我把最后的for循环改了下,
for (i=j-1;;)//ni xiang qv kongbai
        {

            if (isspace(str[i]))
            {
                i--;
            }
            else
            {
                str[i+1]='\0';
                break;
            }
        }
但还是不对。。。能不能把我的程序改下,改成对的,那样我可能才能看懂,先谢谢了。
PS:oj作业已经结束了,我不是求答案 = =。
2012-12-10 20:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-389966-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.719343 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved