C ++结合两个零终止字符串?

时间:2017-01-15 22:15:48

标签: c++ pointers c-strings

所以我在做一个问题,我必须加入两个零终止字符串,第一个包含一个字,第二个是空的,是原始数组的两倍。我能够使用以下代码

来实现这一点
#include <stdio.h>
#include <iostream>

using namespace std;
int main()
{
    char str1[] = "test";
    char str2[(sizeof(str1)-1)*2];

    char *p;
    int count = 0;

    for(p = str1; *p != 0; p++) {
        str2[count] = *p;
        count++;
    }
    cout << str2;
}

但是我必须使用具有以下原型的函数

char *combine(char *a);

所以我试过这个

#include <stdio.h>
#include <iostream>

using namespace std;

char *copy_and_reverse(char *a) {


char str2[8];
    int count = 0;
    char* b = str2;

    for(a; *a != 0; a++) {
        str2[count] = *a;
        count++;
    }

    return b;
}

int main()
{
    char str1[] = "test";

    char *a;
    a = str1;

    char* b = copy_and_reverse(a);

    for(b; *b != 0; b++) {
        cout << *b;
    }
}

但它不起作用(它正在打印字符串,但是它后面会打印几个随机字符),我对指针感到困惑,任何人都可以帮我解决这个问题吗? / p>

编辑:这是我要回答的问题

  

在C ++中编写一个函数,该函数采用char *样式的零终止字符串,并返回两倍于输入长度的char*字符串。返回字符串的前半部分应包含原始数组内容的副本。字符串的后半部分应该以相反的顺序包含原始字符串的内容。

     

该函数应具有以下原型:

char *copy_and_reverse(char* a); 
     

注意:您不应使用任何库函数(例如来自string.h)。

2 个答案:

答案 0 :(得分:1)

您的copy_and_reverse代码存在两个大问题。

  1. 复制输入字符串后,您没有终止结果。这意味着str2不是有效的字符串。修正:

        str2[count] = '\0';  // after the loop
    
  2. copy_and_reverse返回指向局部变量(str2)的指针。函数返回后,其所有局部变量都消失了,main正在处理无效指针。要解决此问题,请使用静态内存(例如,将str2声明为static或将其设为全局变量)或动态内存(使用new[](或malloc())分配存储空间)。这两种方法都有其缺点。

  3. 小东西:

    • variable;不执行任何操作(请参阅for (a; ...)for (b; ...))。
    • str2对于最终结果来说还不够大。 str1长度为5个字节('t', 'e', 's', 't', '\0'),因此char str2[8]现在已足够,但最终您要为结果分配length * 2 + 1个字节。

答案 1 :(得分:-1)

我相信这会满足您的需求:

library(shiny)
library(plotly)
library(data.table)
library(GGally)
library(reshape2)
library(hexbin)

ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("click")
)

server <- function(input, output, session) {

  # Curve number to ID
  cnToID <- function(h){
    df <- data.frame(table(h@cID))
    colnames(df) <- c("ID","count")
    cnID <- df[order(df$count,as.character(df$ID)),]
    cnID$curveNumber <- seq(0, nrow(cnID)-1)
    return(cnID)
  }

  # Create data
  set.seed(1)
  bindata <- data.frame(x=rnorm(100), y=rnorm(100))
  h <- hexbin (bindata, xbins = 5, IDs = TRUE, xbnds = range (bindata$x), ybnds = range (bindata$y))
  hexdf <- data.frame (hcell2xy (h),  ID = h@cell, counts = h@count)
  p <- ggplot(hexdf, aes(x=x, y=y, fill = counts, ID=ID)) + geom_hex(stat="identity")
  #p <- ggplot(hexdf, aes(x=x, y=y, fill = counts), ID=ID) + geom_hex(stat="identity")
  cnID <- cnToID(h)

  output$plot <- renderPlotly({
    p2 <- ggplotly(p)
    for (i in 1:nrow(hexdf)){
      p2$x$data[[i]]$text <- gsub("<.*$", "", p2$x$data[[i]]$text)
    }
    p2
  })

  d <- reactive(event_data("plotly_click"))

  output$click <- renderPrint({
    if (is.null(d())){
      "Click on a state to view event data"
    }
    else{
      clickID <- as.numeric(as.character(cnID[which(cnID$curveNumber==d()$curveNumber),]$ID))
      clickID
      bindata[which(h@cID==clickID),]
    }
  })
}

shinyApp(ui, server)