我需要动态获取字符串但是因为我需要获得多个字符串,所以我需要使用函数。到目前为止我写了这个 (我把// ****放在我认为可能错的地方)
$(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
。似乎没有什么工作。我在搞什么?或许这根本不可能
//非常感谢您的回答
答案 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