2016-04-29 4 views
-1

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

#include<stdio.h> 
#include<iostream> 
using namespace std; 

char string1[10]; 
int count = 0; 
char stringy[10]; 

void enterString() 
{ 
    cout << "please enter a string: " << endl; 
    cin >> string1; 
} 

void stringCounter(const char stringLength[]) 
{ 
    //initiate for loop i = 0 
    //if stringLength[i] does not does not equal 'i' then carry on 
    //increment i 
    for (int i = 0; stringLength[i] != '\0'; i++) 
    { 
     count++; 
    } 
    cout << "size of string is: " << count << endl; 
} 

void reverseString(int arraySize, char string2[]) 
{ 
    int counter = 0; 
    for (int i = arraySize; i >= 0; string2[i--]) 
    { 
     stringy[counter] = string2[i]; 
     counter++; 
    } 
    stringy[count] = '\0'; 
    cout << stringy << endl; 
} 

int main() 
{ 
enterString(); 
stringCounter(string1); 
reverseString(count, string1); 
return 0; 
} 

Это вся программа. Программа не работает в функции reverseString. Я не могу решить, как успешно прочитать последний индекс char array string2[] и скопировать его в первый индекс char array stringy.

+1

Почему 'string2 [i -]' вместо просто 'i -' в цикле for? –

+0

@KarstenKoop У меня на самом деле нет подсказки ... вы абсолютно правы – nrs90

ответ

1

Один, если пользователь вводит строку длиной более 10 символов, тогда ваша функция enterString() получит доступ к массиву из своей границы, по адресу cin>>string1. Поэтому лучше использовать getline, чтобы убедиться, что вы не читаете больше того, что может держать ваш массив.

2, с вашей текущей реализацией функция reverseString() будет записывать в первый элемент массива с символом нулевого терминатора, если arraySize<=10, и пытается отобразить эту строку, не покажет вам ничего.

Это:

cin >> string1;//will try to access the array out of its bound if user give more than it can hold,i.e 10 characters 

... 

for (int i = arraySize; i >= 0; string2[i--]) 
{ 
    stringy[counter] = string2[i];//the first iteration will put the '\0' character as the first elements of stringy 
    counter++; 
} 

Должен быть изменен на:

cin.getline(string1,10);//make sure to get not more than 10 characters,including the null terminator 

..... 

for (int i = arraySize-1; i >= 0; i--) 
{ 
    stringy[counter] = string2[i]; 
    counter++; 
} 
+0

Отлично, это объясняет! Спасибо – nrs90

+0

Привет @bkVnet, вы можете объяснить, как я бы реализовать getline, чтобы убедиться, что я не читаю больше символов, чем может содержать мой массив? – nrs90

+0

@ nrs90 Первый аргумент 'getline' - это место назначения, в котором будет помещена строка, которая будет прочитана, второй аргумент - количество прочитанных символов. Так, например, если у вас есть массив с именем 'destination', который может содержать' n' количество элементов, то вы говорите 'cin.getline (destination, n)' для чтения максимум символа 'n' из потока, который является максимальный массив может удерживаться. –

0

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

#include<iostream> 

using namespace std; 

void reverseString(int , char *); 
int stringCounter(const char); 

int stringCounter(const char stringLength[]) 
{ 
    int count = 0; 
    for (int i = 0; stringLength[i] != '\0'; i++) 
     count++; 
    cout << "size of string is: " << count << endl; 
    return count; 
} 
void reverseString(int arraySize, char string2[]) 
{ 
    int counter = 0; 
    char stringy[100]; 
    for (int i = arraySize - 1; i >= 0; i--) 
    { 
     stringy[counter] = string2[i]; 
     counter++; 
    } 
    stringy[counter] = '\0'; 
    cout << stringy << endl; 
} 

int main() 
{ 
    char str[] = "string"; 
    reverseString(stringCounter(str),str); 

    return 0; 
} 
Смежные вопросы