2014-11-25 2 views
0

Возможно, мой код не работает, но любые символы пробела (\ n, \ t, \ r и т. Д.) Не преобразуются в пробел "". Насколько я могу судить, похоже, что он должен работать, но он seg неисправен каждый раз, когда он попадает в новую строку.isspace работает неправильно?

Редактировать: Извините, он меняет символы белого пространства на '', но он останавливается после того, как наступила новая строка. Затем программа запускает код до тех пор, пока это новое пятно линии - где это произойдет.

Он также не заменит никаких белых пространств. Код рисуется в 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

вы должны intialise переменной Len обратно в 0 после первого цикла также начать использовать отладчик – 999k

+0

Вашего второго 'strtok' (один с 'NULL') должен быть * после * вызова' rstrip', в противном случае вы пропускаете первый токен (и не завершаете цикл должным образом). И 'isspace' работает отлично. Причины любых проблем, – ooga

+0

'if (buf [len] <0)' это может произойти только в том случае, если 'FILE * in = fopen (" alice.txt "," r ");' failed.Убедитесь, что файл открыт перед чтением. (например, 'if (! in) {printf (" error: open failed \ n "; return 1;}'. Это предотвратит чтение ** странных ** символов из текстового файла. Сделайте то же самое для 'out' до написания. –

ответ

0

В дополнение к проверке, что ваш FILE *streams открыты, вам также необходимо проверить значения, передаваемые вашим функциям. Когда strtok завершает токенизацию, он возвращает NULL. Вы не хотите передавать NULL в rstrip. Например:

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 

Работайте над этими улучшениями и отправляйте назад, когда вы снова застряли.

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>:.

In all cases the argument is an int , the value of which shall be representable as an unsigned char or shall equal the value of the macro EOF.

+0

@RolandIllig: Да, исправлено. –

 Смежные вопросы

  • Нет связанных вопросов^_^