2015-05-03 4 views
0

В настоящее время я кодирую небольшую программу вращения. Но у меня проблемы со строками типа «это тест». Когда у меня есть такая строка, она кодирует только первые 4 символа, а не целую строку. Кажется, что пробелы что-то ломают. Я пытался игнорировать пробелы с выражением if, но это не работает, и я не знаю, почему. У вас есть идея по этой проблеме?Итерация над строкой с пробелами

И да ... код очень экспериментальный поэтому, пожалуйста, не бушевать о константных размерах массива и таких вещах ..

#include <stdio.h> 
#include <stdlib.h> 
#define alphabetsize 26 

char alphabet[alphabetsize] = {'a','b','c','d','e','f','g','h','i','j', 
        'k','l','m','n','o','p','q','r','s','t', 
        'u','v','w','x','y','z'}; 
char lookup[alphabetsize] = {'0'}; 

char target[100] = {' '}; 

int search(char ch){ 
    int i = 0; 
    for(; i < alphabetsize; i++){ 
    if(alphabet[i] == ch) return i; 
    } 
} 

char* rotate(char string[], int rotn){ 
    int i = 0; 
    for(; i < alphabetsize ; i++){ 
    lookup[rotn] = alphabet[i]; 
    rotn++; 
    if(rotn == (alphabetsize)) rotn = 0; 
    } 
    i = 0; 
    int index = 0; 
    for(; i < 100; i++){ 
    printf("%d\n", i); 
    if(string[i] != ' '){ 
     index = search(string[i]); 
     target[i] = lookup[index]; 
    } 
    } 
    printf("%s\n", target); 
    return target; 

} 

int main(int argc, char *argv[]){ 
    int rotn = strtol(argv[2], NULL, 10); 
    printf("String: %s\n", argv[1]); 
    printf("Used Rotation degree: %d\n", rotn); 
    char* string = rotate(argv[1], rotn); 
    printf("Decrypted/Encrypted String: %s\n", string); 

    return 0; 
} 
+0

Пространства между аргументами программы в конечном итоге заставляют их быть отдельными аргументами ... т. Е. './progname this is test' помещает' this' в 'argv [1]', 'is' в' argv [2] ',' a' в 'argv [3]' и 'test' в' argv [4] '. Попробуйте прочитать строку с помощью 'fgets()' или что-то вроде этого в программе, а затем обработать ее. – JohnH

+0

Нет, я начинаю программу с: ./rot «это тест» 13. «Это тест» - это один аргумент .. не 3 – Shibumi

ответ

3

Часть вашей проблемы находится в search, что fai ls, чтобы вернуть значение, если ch не найден в alphabet. В действительности это означает, что он вернет неизвестное значение, которое вы затем используете без каких-либо проверок для индексации массива lookup.

В зависимости от случайного содержимого памяти вы можете вводить пробелы или NUL символов в ваш массив target.

Это фактически инициируется вашей функцией rotate, которая не проверяет наличие NUL во входной строке, и это не заканчивается в конце строки.

Испытание

if(string[i] != ' ') 

позволяет search называться с входной строки неизбежного NUL. Затем продолжить называть поиск еще восемьдесят или около того раз со случайными значениями - большинство из которых вряд ли будет в 'a'...'z'

Как только вы вызываете search с чем-то другим, чем строчной характер, ваша программа выключена в мире неопределенного поведения.

Fnially, как отметил @gaemaf, ваш выходной индекс в цикле должен быть независимым от входного индекса i. Когда вы пропускаете пробелы на входе, вы также продвигаете указатель вывода (как вы используете i для обоих).

Инициализация target[100] = {' '} только инициализирует первое местоположение массива. Остальное содержит двоичный нуль, который printf в main интерпретирует как конец строки. Следовательно, даже если вы повернуть всю строку, будет распечатано только первое слово или около того.

Чтобы проверить, попробуйте ввести строку ввода «bc def». Я подозреваю, что вы получите только один напечатанный персонаж.

+0

Это не часть моей проблемы ... Когда у меня есть пробельный символ, Функция 'search' не будет называться cuz оператора if. И я сказал, что его экспериментальный код я знаю, что кто-то может добавить некоторые другие вещи .... – Shibumi

+0

Посмотрите мое обновление о том, почему это на самом деле * * проблема для вас – kdopen

+0

yes thx. Я нашел ту же причину проблемы несколько минут назад. проблема должна быть исправлена. Я инициализировал массив пробелами с 'memset'. Thx для упоминания других проблем. – Shibumi

0

Это не помогает решить проблему с вашим кодом, и является примером кода, который, вероятно, не даст вам хорошего качества из-за его запутывания, но вы должны понимать, что проблемы типа «rotN» легко решаются с помощью модульной математики, если вы понимаете компоновку набора символов ASCII ...

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

char* rotate(char *s, int rotn) 
{ 
    char *s1=s; 
    for(;*s!='\0'; s++) if(isalpha(*s)) 
    *s = ((*s>'Z')?'a':'A')+(((*s-((*s>'Z')?'a':'A'))+rotn)%26); 
    return s1; 
} 

int main(int argc, char *argv[]) 
{ 
    int rotn = strtol(argv[2], NULL, 10); 
    printf("String: %s\n", argv[1]); 
    printf("Used Rotation degree: %d\n", rotn); 
    char* string = rotate(argv[1], rotn); 
    printf("Decrypted/Encrypted String: %s\n", string); 
    return 0; 
} 
2

я обнаружил проблему, поэтому, пожалуйста, попробуйте и дай мне знать:

в циклическом сдвиге функции изменить ваш для:

int targetIndex = 0; 
for (; i < 100; i++){ 
    printf("%d\n", i); 
    if (string[i] != ' '){ 
     index = search(string[i]); 
     target[targetIndex++] = lookup[index]; 
    } 
} 

В противном случае, потому что ваша цель инициализируется NULL, вы никогда не увидите полный результат. Чтобы преодолеть свою проблему, вам нужно добавить еще одну переменную типа targetIndex.

+0

Это тоже проблема, если я объясню это немного больше в моем ответе? Другие проблемы также должны быть исправлены. – kdopen

+0

@kdopen извините, но когда я пытаюсь ответить, у меня нет времени, чтобы узнать, что вы или другие делаете. Для меня это не проблема с вами, я стараюсь не отставать от своих знаний о языке C, ничего другого. Так что я понял из вопроса, где проблема? Я считаю, что нашел. Хорошо, это не идеальный ответ. В конце, если сообщество будет рассматривать мой ответ плохо (downvote), я удаляю, как бы сказать, извиняюсь со всеми вами и лучше читаю ваш или другой ответ, чтобы улучшить свое значение. Благодарю. – gaetanoM

+0

@kdopen идеальный ответ. Через несколько минут я удалю свой ответ. Большое спасибо – gaetanoM

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