使用指针

时间:2015-07-11 16:05:59

标签: c++ string

这是一个业余问题。我搜索了关于这个主题的其他帖子,发现了很多结果,但我还没有理解解决方案背后的概念。

这是我的C ++书籍中的练习题。它没有分配作业。 [这里的说明] [1]。

我想做什么:

string input;
getline(cin, input); //Get the user's input.

int front = 0;
int rear;

rear = input.size();

问题是我要做什么

string input;
getline(cin, input); //Get the user's input.

int* front = 0;
int* rear;

rear = input.size();

错误:无法将类型为“size_t”的值分配给int *

类型的实体

这对我来说很有意义,因为你不能将int的'address'分配给int的值。 所以我的问题是:

  • 这是怎样的正确方法?我应该忘记初始化前*或后*到整数?只是避免这一切?如果是这样,该解决方案的语法是什么?
  • 为什么这个问题会让我使用像这样的指针?很明显,这是指针的可怕用法。没有指针我可以在30秒内完成这个问题。这真是令人沮丧。
  • 除了做一些像使用指针返回数组之类的东西之外,我并没有真正看到使用指针的优势。

谢谢你们。我知道你喜欢帮助自助的用户,所以我先做了一些研究。我现在对指针的概念感到非常恼火,而不仅仅是使用实际变量本身。

我之前读过的关于这个主题的帖子:

2 个答案:

答案 0 :(得分:3)

string.size()不返回指针 - 它返回size_t。

要恢复字符串,请尝试改为:

string original = "someText";  // The original string
string reversed = original;    // This to make sure that the reversed string has same size as the original string

size_t x = original.size();    // Get the size of the original string

for (size_t i = 0; i < x; i++)        // Loop to copy from end of original to start of reversed
{
    reversed[i]=original[x-1-i];
}

如果你真的(出于一些奇怪的原因)需要指针试试这个:

string input;
getline(cin, input); //Get the user's input.

char* front = &input[0];
char* rear = &input[input.size()-1];

但我不会将指针用于字符串。不需要它。

答案 1 :(得分:1)

我是客人,你可能不太明白这里的问题。此问题要求您复制C字符串然后通过指针操作REVERSE它。标准C中没有类。因此,C字符串与C ++中的字符串类完全不同。它实际上是以字符'\ 0'结尾的char类型元素数组。

了解了这一点后,您可能会开始理解这里的问题。如果要复制C字符串,则不能只使用str_a = str_b。你需要构造函数。但是,在纯C风格中,首先应该为字符串请求内存空间(这里可以使用malloc),然后复制每个元素。例如,您要创建一个函数来复制输入字符串

#include <string.h>

char *strcopy(char* str_in) {
    int len = strlen(str_in);
    char *str_out = (char*)malloc(len+1);

    char *in  = str_in;
    char *out = str_out;
    while(*in != '\0') { *out++ = *in++; }

    return str_out;
}

如您所见,我们实际上在这里使用char*而不是int*来操作字符串元素。您应该首先区分指针(例如in)和指针指向的元素(例如*in)。

我将为您的问题向您展示纯C风格的解决方案,我希望这有助于您理解它。 (你应该可以不加修改地编译它)

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

char* strreverse(char* in){
    // length of input string
    int len = strlen(in);
    // allocate memory for string operation
    char *out = (char*)malloc(len+1);
    // initialize <front> and <end>
    char *front = out, *end = out + len - 1;

    char buffer;

    // copy input string
    for(int i = 0; i <= len; i++){ out[i] = in[i]; }

    // reverse string
    for(; front < end; front++, end--) {
        buffer = *front;
        *front = *end;
        *end = buffer;
    }

    return out;
}

int main() {
    printf("REVERSE >> %s\n", strreverse("Hello, World!"));
    return 0;   
}

这不是你在实际编程中用C ++做的,但是,我想这里的问题是试图让你理解指针的机制。在这方面,原创C风格会有很大帮助。