isspace无法正常工作?

时间:2014-11-25 06:14:10

标签: c file ctype

可能是我的代码不能正常工作,但是任何空白字符(\ n,\ t,\ r \ n等)都没有被转换为空格“”。据我所知,它看起来应该可行,但每次遇到新线时都会出现故障。

编辑:抱歉,它确实将空白行为更改为'',但在新行被点击后停止。然后程序运行代码,直到新的线点 - 它出现故障。

它也不会取代任何白色空格。 代码绘制.txt文件,因此如果要运行它,请创建一个名为alice.txt的文本文件(或者您可以更改代码)并在文件中包含空格字符。

你能帮助我吗?我一直试图解决这个问题几个小时无济于事。我究竟做错了什么?谢谢!

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

#define LEN 4096

void upper(char *tok, FILE *out);
void rstrip(char *tok, FILE *out);

int main ()
{
    char *tok;  //tokenizer
    char buf[LEN];
    FILE *in = fopen("alice.txt", "r");
    FILE *out = fopen("out.txt", "w");
    int len = 0;

    while (fgets(buf, LEN, in)) {
        /* cleans all line breaks, tabs, etc, into space*/
        while (buf[len]) {
            printf("%c", buf[len]); //Error checking, prints each char of buf
            if (isspace(buf[len]))  //isspace not working properly? not changing \t, \r, etc to ' ' */
                buf[len] = ' ';     //not replacing
            if (buf[len] < 0)   //added cuz negative character values were being found in text file.
                buf[len] = ' '; 
            len++;
        }

        /*parses by words*/
        tok = strtok(buf, " ");
        rstrip(tok, out);
        while (tok != NULL) {
            tok = strtok(NULL, " ");
            rstrip(tok, out);
        }
    }

    fclose(in);
    fclose(out);
    return 0; 
}

/*makes appropiate words uppercase*/
void upper(char *tok, FILE *out)
{
    int cur = strlen(tok) - 1; //current place

    while (cur >= 0) {
        tok[cur] = toupper(tok[cur]);
        printf("%s\n", tok); 
        fprintf(out, "%s", tok);
        cur--;
    }

}

/*checks for 'z' in tok (the word)*/
void rstrip(char *tok, FILE *out)
{
    int cur = strlen(tok) - 1; //current place

    printf("%s", tok);
    while (cur >= 0) {
        if (tok[cur] == 'z')
            upper(tok, out);
        cur--;
    }
}

2 个答案:

答案 0 :(得分:1)

您将len = 0;设置在错误的位置。

你需要:

while (fgets(buf, LEN, in) != 0)
{
    for (int len = 0; buf[len] != '\0'; len++)
    {
        printf("%c", buf[len]);
        if (isspace((unsigned char)buf[len]))
            buf[len] = ' ';
        if (buf[len] < 0)
            buf[len] = ' ';
    }
    …rest of loop…
}

这可确保您为每行读取len设置为0。您还需要确保isspace()的参数有效 - 这意味着它是int,并且必须是EOF或与unsigned char对应的值。

C标准说(参考is*()<ctype.h>函数的参数:

  

在所有情况下,参数都是int,其值应为。{1}}   可表示为unsigned char或等于宏EOF的值。

答案 1 :(得分:0)

除了验证您的FILE *streams是否已打开外,您还需要验证传递给您的函数的值。 strtok完成标记后,会返回NULL。您不希望将NULL传递给rstrip。 E.g:

void rstrip(char *tok, FILE *out)
{
    if (!tok) return;          // validate tok

    int cur = strlen(tok) - 1; //current place

您需要对upper执行相同的操作。简单地解决这些问题还有很长的路要走。在纳入验证和J.L。建议的更改之后:

<强>输入

$ cat alice.txt
#include <stdio.h>
int func()
{
z z z z z
}
int main(void)
{
    printf("%d\n",func());
    return 0;
}

<强>输出:

$ ./bin/ctypehelp
#include <stdio.h>
#include<stdio.h>int func()
intfunc(){
{ z z z z z
zZ
zZ
zZ
zZ
zZ
}
}int main(void)
intmain(void){
{    printf("%d\n",func());
printf("%d\n",func());    return 0;
return0;}

<强> out.txt:

$ cat out.txt
ZZZZZ

处理这些改进,并在再次陷入困境时回复。