Honeycrisp
Honeycrisp

Reputation: 53

using a string array in a function C++

this question should be easy and straight forward, but after searching online, I couldn't find an answer. might because the question is just too simple.
following code is from cplusplus.com. it's a function of making a string lowercase. I was intended to do something similar.

/* tolower example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (tolower(c));
    i++;
  }
  return 0;
}

and what I made is this:

void search(string A[], string B[], int k)
{                               
    int temp;
    for(int j = 0; j <= 4; j++)
    {
        for(int i = 0; i <= k; i++)
        {
            string str (A[i]);
            int h = 0;
            char lstr[] = B[j];
            char c;
            while (lstr[h])
            {
                c = lstr[h];
                putchar (tolower(c));
                h++;
            }
            string key (B[j]);
.....

this part of the code is in a for loop. B[j] is a string array.
Visual Studio informed me that char lstr[] = B[j]; part is not right, the error message is:
Error: initialization with '{...}' expected for aggregate object.

I think the problem is that I didn't use the correct syntax of using a string array in a function. something should be done for B[j], in order to make it a char array. I couldn't figure it out.
is that something about pointer? sorry I haven't learn pointer yet.

does my question make sense for you? any help is greatly appreciated!!

Upvotes: 1

Views: 304

Answers (3)

greatwolf
greatwolf

Reputation: 20838

If you're looking to make the letters in the string lowercase it's more readable to just work with strings all the way and use std::transform. For example,

// make sure to #include <algorithm>
// at the top
string lstr = B[j];
std::transform(lstr.begin(), lstr.end(), lstr.begin(), ::tolower);

This is much more natural and c++ idiomatic than working with char * directly and less error-prone.

Upvotes: 1

ryanbwork
ryanbwork

Reputation: 2153

You're confusing character arrays and string objects here. A character array is an array of bytes of set size which is null terminated, while a string is an object which expands/contracts as is necessary and doesn't require the null terminator. You're attempting to assign a string object to a character array, which is unsupported. If you're working with string objects, and want to retrieve their equivalent character array, utilize the c_str() function:

const char* lstr = B[j].c_str()

Also, utilizing an array name of B and an index of j is hilarious.

Upvotes: 1

Vite Falcon
Vite Falcon

Reputation: 6645

You're trying to assign a char to char[]. You can get the effect you want with the following code:

....
int h = 0;
char* lstr = &B[j]; // point lstr to the address of j'th element of B.
char c;
while (lstr[h])
{
    c = lstr[h];
    putchar (tolower(c));
    h++;
}
.....

What this does is that lstr is now a pointer that points to the j'th character in B. Arrays are essentially pointers. When you do B[j], it's equivalent to writing char ch = *(B + j);, where B points to the address of the first character in the array of characters (otherwise known as string).

EDIT After your edit, it now seems that you're trying to assign a std::string to a char. Here is the corrected solution.

....
int h = 0;
string& lstr = B[j]; // grab a reference to the j'th string in B.
char c;
while (lstr[h])
{
    c = lstr[h];
    putchar (tolower(c));
    h++;
}
.....

Here, lstr is essentially a reference to the j'th string in B and you can use it as a regular string just like how you're using string str(A[i]);, which makes a copy of the i'th string in A.

Upvotes: 1

Related Questions