使用C函数获取字符串

时间:2016-12-24 18:10:18

标签: c string function

我需要动态获取字符串但是因为我需要获得多个字符串,所以我需要使用函数。到目前为止我写了这个 (我把// ****放在我认为可能错的地方)

$(document).ready(function() {

  $(window).load(function() {
    // Call your function to START storing the data
  });

  $(window).focus(function() {
    // Call your function to START storing the data
  });

  $(window).blur(function() {
    // Call your function to STOP storing the data
  });

  //tabCloseEvent();
  $(window).bind('beforeunload', function() {
    // Call your function to STOP storing the data
  });



});
函数中的

char* getstring(char *str); int main() { char *str; strcpy(str,getstring(str));//***** printf("\nString: %s", str); return 0; } char* getstring(char str[]){//***** //this part is copy paste from my teacher lol char c; int i = 0, j = 1; str = (char*) malloc (sizeof(char)); printf("Input String:\n "); while (c != '\n') {//as long as c is not "enter" copy to str c = getc(stdin); str = (char*)realloc(str, j * sizeof(char)); str[i] = c; i++; j++; } str[i] = '\0';//null at the end printf("\nString: %s", str); return str;//****** } 正在运行,但不在printf函数中。 我尝试返回main,删除void或添加,再添加*s并转到str2,或者根本不使用strcpy。似乎没有什么工作。我在搞什么?或许这根本不可能 //非常感谢您的回答

4 个答案:

答案 0 :(得分:3)

获取字符串部分可以从此answer获取。只需将\n作为getline功能的输入。

char * p = getline('\n');

三件事: -   不要投射malloc,检查malloc/realloc是否成功且sizeof不是函数。

答案 1 :(得分:3)

问题不在于您正在使用的功能,而在于尝试将其结果复制到未初始化的指针中。

好消息是您不必复制 - 您的函数已经在动态内存中分配了一个字符串,因此您可以直接复制指针:

char *str = getstring(str);

这应该可以解决崩溃问题。要使您的功能更好,需要考虑几点:

  • main完成后需要free(str)才能避免内存泄漏
  • realloc存储为临时指针,然后执行NULL检查以正确处理内存不足情况

答案 2 :(得分:3)

现在有两件事要从课程中拿走:

(1)你应该有一种方法可以将引用返回给新字符串,作为通过引用函数OR传递的参数或作为返回值;你不应该同时实施这两个。

(2)因为你的老师给你的子程序在堆上分配内存,它将可用于你的程序的任何部分,你不必自己分配任何内存。您应该研究堆内存,全局内存和自动(堆栈)内存之间的区别,以便了解它们之间的差异并了解如何使用每种类型。

(3)因为内存已经在堆上分配,所以不需要复制字符串。

鉴于这些事实,您的代码可以简化为以下内容:

int main() {

    char *str = getstring();
    printf( "\nString: %s", str );
    return 0;
}

char* getstring(){
   .... etc

展望未来,您想要考虑如何在程序中取消分配内存。例如,在此代码中,字符串永远不会被解除分配。考虑解除分配任何内存的策略是一个好习惯。

答案 3 :(得分:1)

让我们简化一下代码:

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

char* getstring()
{
    char c = 0;
    int i = 0, j = 2;
    char *str = NULL;

    if ((str = (char*) malloc(sizeof(char))) == NULL)
        return NULL;

    printf("Input String: ");
    while (c = getc(stdin)) {
        if (c == '\n') break;

        str = (char*) realloc(str, j * sizeof(char));
        str[i++] = c;
        j++;
    }
    str[i] = '\0';
    printf("getstring() String: %s\n", str);
    return str;
}

int main()
{
    char *str = getstring();
    printf("main() String: %s\n", str);
    free(str);
    return 0;
}

然后执行:

$ make teststring && ./teststring 
cc     teststring.c   -o teststring
Input String: asdfasfasdf
getstring() String: asdfasfasdf
main() String: asdfasfasdf