2016-04-08 3 views
2

Для моего класса программирования я пытаюсь написать функцию incrementstring(), которая берет строку 'str', переданную из драйвера, и добавляет ее к ней. Он должен работать как с буквами, так и с числами (например, «1» переходит в «2», «a» переходит в «b», «z» переходит в «aa», «ZZ» переходит в «AAA»). У меня почти все условия тестирования, за исключением одной ошибки, с которой я не могу найти пути.Функция увеличения строки в C

Это то, что я в настоящее время:

void incrementstring(char* str){ 
int i; 
int j; 
int length = strlen(str); 
for(i = strlen(str)-1; i >= 0; i--){ 
    if (str[i] == '9'){ 
      str[i] = '0'; 
      if (str[0] == '0'){ 
        for (j = strlen(str)-1; j>=0; j--){ //This loop is the problem 
          str[j+1] = str[j]; 
          } 
        str[0] = '1'; 
        } 
    } 
    else if (str[i] == 'z'){ 
      if (str[0] == 'z'){ 
        str[i] = 'a'; 
        str[i+1] = 'a'; 
        } 
      str[i] = 'a'; 
      } 

    else if (str[i] == 'Z'){ 
      if(str[0] == 'Z'){ 
        str[i] = 'A'; 
        str[i+1] = 'A'; 
      } 
      str[i] = 'a'; 
    } 
    else{ 
      str[i]++; 
      return; 
    } 

} 
} 

При запуске функции, это то, что выходы драйвера:

1. testing "1"... = 2. Correct! 
2. testing "99"... = 100. Correct! 
3. testing "a"... = b. Correct! 
4. testing "d"... = e. Correct! 
5. testing "z"... = INCORRECT: we got "aa0". We should be getting "aa" instead. 
6. testing "aa"... = ab. Correct! 
7. testing "Az"... = Ba. Correct! 
8. testing "zz"... = aaa. Correct! 
9. testing "cw"... = cx. Correct! 
10. testing "tab"... = tac. Correct! 
11. testing "500"... = 501. Correct! 

11 tests run. 

Я написал цикл в строке 9, чтобы обрабатывать " 99 'до' 100 '. Он принимает каждый индекс строки и сдвигает ее вправо, а затем добавляет «1» к началу строки. Однако этот цикл по какой-то причине испортил пятое тестовое условие, как видно выше. Если я выберу петлю, «99» перейдет к «00», но пятый тест пройдет без проблем. Я ударил кирпичную стену здесь, и мне было интересно, может ли кто-нибудь дать представление.

Я ценю помощь, спасибо.

+8

После вашего «переноса» (то есть, когда вы расширяете «строку»), вам нужно добавить байт NUL для завершения в массиве. Все 'str [i + 1] =' должны иметь 'str [i + 2] = '\ 0';' после них. Вы также понимаете, что принимаете набор символов ASCII, правильно? Или это рассмотрение выходит за рамки класса? – mpez0

+0

Использование отладчика также может быть полезно здесь. –

+0

Ваш «перенос» на самом деле не работает во всех случаях: попробуйте ввести «zaz» - это должно трансформироваться в «zba», если я правильно понял ваше требование, но расширяется до «zaaa». Вы не можете перенести свой «перенос» на весь путь, а только взгляните на главный символ. – tofro

ответ

1

Хотя также отслеживание длины строки, чтобы убедиться, что вы не перезаписывать ее выделенное пространство, добавить нулевой символ завершения для каждого из ваших if() и if else сегментов:

str[0] = '1'; 
str[1] = 0; 

...

str[i] = 'a'; 
str[i+1] = 0; 

И так далее.

Это окончательное утверждение не может делать то, что вы ожидаете от него.
Я считаю, что вы хотите увеличить выражение, чтобы указать на следующий элемент памяти, принадлежащий str.
Имейте в виду, что str на самом деле не является массивом. Это указатель. [...]
Обозначение, которое вы используете, представляет собой удобство, предоставляемое в C, чтобы разрешить массив, например, ссылку указателей.
Так, выражение str[i], например, также может быть выражено как *(str + i). Если следующая ячейка памяти (где следующий char хранится) вы хотите, то выражение будет: *(str + i++), что при использовании обозначения массива переводится: str[i++]

Измените следующий из

else{ 
     str[i]++; 

к:

else{ 
     str[i++]=0; 
+1

Это, казалось, делало трюк в дополнение к добавлению завершающих операторов NULL в конец каждого оператора if. Спасибо всем за помощь, вы, ребята, удивительное сообщество. – acorbs

1

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

Все, что вам нужно сделать, это заполнить char * строкой, сделать следующий символ символом '\0'. Поскольку функция strlen просто выполняет итерацию по массиву char с, пока не достигнет символа завершения NULL, перед использованием вы должны прервать все строки с этим символом.

+0

Примечание: В C верхний регистр NULL лучше всего зарезервирован для константы нулевого указателя для NULL. Здесь укажите _null character_ или '' \ 0''. – chux

0

ли работа для "ЗАЗа" правильно?

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