是否有像atoi这样的函数读取缓冲区以返回字符串?
fgets(input, data_len, stdin);
return atoi(input + 6); // i need the string
感谢
完整代码
char *getInput2(char *param) {
data_len=atoi(getenv("CONTENT_LENGTH"));
char input[data_len];
fgets(input, data_len, stdin);
char *r_str;
strcpy (r_str, input+6);
return r_str;
}
最后,内部服务器错误........
char *getInput2(char *param) {
char input[100];
data_len=sizeof(input);
fgets(input, data_len, stdin);
return strdup (input+7);
}
只能返回第一个char ......输入12只返回1,有什么问题?
答案 0 :(得分:2)
我不完全确定你在问什么,但如果它是如何在偏移6处得到整数的字符串表示,你可以分两步执行:
char str[enough_to_hold_datalen_and_then_some];
int val = atoi (input+6);
sprintf (str, "%d", val);
或者,如果你想得到一个字符串的块,无论它是否由数字组成:
strcpy (str, input+6); // get the rest of the string
strncpy (str, input+6, 4); str[4] = '\0'; // get up to four characters.
如果您的问题是输入是函数的局部变量,并且当您返回其地址时,您会得到虚假数据,因为它超出了范围,我会使用:
return strdup (input+6);
这将在堆上返回一个字符串的副本(这是一个长期存在而不是堆栈帧,而不是)。
请记住,当你完成它时,你需要free
那个记忆。并确保您实际上在该缓冲区中有六个字符。
如果您的C实施没有strdup
,请使用this one。
根据您的更新,您看起来就像是在最后一个选项之后。使用您的代码:
char *r_str;
strcpy (r_str, input+6);
return r_str;
你实际上并没有分配任何存储来放置字符串副本(因此崩溃)。我会用一个简单的替换整个位:
return strdup (input+6);
正如我的建议。
如果strcpy()的目标字符串不够大(即,如果程序员是愚蠢/懒惰的,并且在复制之前未能检查大小),则可能发生任何事情。溢出的固定长度字符串是最喜欢的饼干技术。
答案 1 :(得分:0)
假设你想要返回字符串,那么atoi与它无关。相反,您的问题是您无法返回本地变量的内存。在C中返回记忆总是很困难;通常,您返回动态分配的内存并期望调用者释放它:
char* get_value()
{
char input[100];
int data_len = sizeof(input);
char *result;
fgets(input, data_len, stdin);
result = malloc(strlen(input)-5); /* reserve enough memory, including the terminating NUL */
strcpy(result, input+6);
return result;
}
(你可以通过使用strdup缩短这个)
或者,您可以使用全局变量,但这不会是可重入的:
char input[100];
char* get_value()
{
int data_len = sizeof(input);
fgets(input, data_len, stdin);
return input+6;
}