2014-01-11 3 views
-1

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

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

void crypt(char*); 

int main() 
{ 
    //one random message of up to 10 chars and function call. 
    char str[7] = "george"; 

    crypt(str); 

    printf("%s",str); 
} 

//this function crypt's the initial string's message. 
void crypt(char str[]) 
{ 
    int i=0; 

    while ((i<=10)&&(str[i]!='\0')) 
    { 
     if (str[i]<=119) {str[i] = str[i] + 3;} 
     else if (str[i]==120) {str[i]='a';} 
     else if (str[i]==121) {str[i]='b';} 
     else {str[i]='c';} 
     i++; 
    } 
} 

}

Вместо DevC++ дает мне эту ошибку:

***In function 'int main': 
[Error] invalid conversion from 'char*' to 'char' [-fpermissive] 
[Error] initializing argument 1 of 'void crypt(char)' [-fpermissive]*** 

Любая помощь будет оценена. Заранее спасибо.

+0

@BLUEPIXY Спасибо за ваш ответ. Я изменился на void crypt (char *); но я считаю, что цикл while правильный с ||. – Mechanic45

+0

С другой стороны, да, вы были правы на обоих счетах. – Mechanic45

ответ

0

Измените прототип функции для

void crypt(char *); 

Согласно комментарий OP в:

right after "jhrujh" the program continues to print 7-8 more wired chars. any ideas?

Ваша логика в while цикле неправильно.

void crypt(char str[]) 
{ 
    int i=0; 

    while (str[i]!='\0') 
    { 
     if (str[i]<=119) {str[i] = str[i] + 3;} 
     else if (str[i]==120) {str[i]='a';} 
     else if (str[i]==121) {str[i]='b';} 
     else {str[i]='c';} 
     i++; 
    } 
} 
+0

Еще раз спасибо. Я изменил его, и он возвращает «jhrujh», что является ожидаемым значением, но сразу после «jhrujh» программа продолжает печатать 7-8 дополнительных проводных символов. есть идеи? – Mechanic45

+0

Измените цикл 'while'. – haccks

+0

@ Mechanic45; См. Редактирование. – haccks

1

Вы должны заменить

int i=0; 

if (str[0]!='\0') 
{  
    do 
    { 
     ... 
    }while ((i<=10)||(str[i]=='\0')); 
} 

(который содержит логическую ошибку в состоянии while)

с

int i=0; 

while (str[i]!='\0') 
{  
    ... 
} 

, потому что:

  • тест на i<=10 кажется бессмысленным и слишком ограничительным для меня и
  • , если его опустить, то if и do..while лучше можно выразить с помощью одного while, который проверяет на старте.
+0

Спасибо за ваш совет. готово. – Mechanic45

2

вы могли бы попробовать что-то вроде этого вместо

void crypt(char* str) // to conform with your prototype 
{ 
    for (int i = 0; str[i] != '\0' && i < 10; ++i) 
    {  
    if (str[i]<=119) { str[i] = str[i] + 3; } 
    else if (str[i]==120) { str[i]='a'; } 
    else if (str[i]==121) { str[i]='b'; } 
    else { str[i]='c'; } 
    } 
} 
+0

Спасибо. Могу ли я спросить, есть ли какая-то конкретная причина для вашего предпочтения цикла for за время? – Mechanic45

+1

Да, я нахожу, что это более ясно и прямолинейно, цикл do должен запускаться один раз до того, как условие проверяется, поэтому для этого нужно проявлять особую осторожность. –

+0

О, я вижу, большое спасибо за ваш ответ. – Mechanic45

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