我试图从我的sCopy()函数返回一个字符串,所以我可以在我的代码的main()函数中打印它。请帮忙。
const char *sCopy(char buffer[256], int i);
int main() {
int i;
int x;
char buffer[256];
char newBuffer;//[256];
printf("Please enter a number: ");
fgets(buffer, 256, stdin);
i = atoi(buffer);
printf("The value you entered is %d. Its double is %d.\n", i, i*2);
newBuffer = sCopy(buffer, i);
printf(newBuffer);
return 0;
}
const char *sCopy(char buffer[256], int i){
char nBuffer[256];
char *t;
int x;
for(x = 0; x < i; x++){
strcat(t, buffer);
}
//t = nBuffer;
return t;
}
答案 0 :(得分:1)
我的分析如下。从我在这里看到的,您应该了解指向char(char *)和char数组的指针之间的区别。我真的很感激,尽管你在问之前已经尝试过解决它。
const char *sCopy(char buffer[256], int i);
/* let's start from here, what i represents? Keep in mind that the most of the */
/* time an external developer will see just your declaration of a method, always */
/* try to give significant names to variables. */
int main() {
int i = 0;
/* always initialize variables to default values, especially if they are */
/* going to be indexes in a buffer. */
int x = 0;
char buffer[256] = "";
/* you can even initialize this to "" in order to mimic an empty string, */
/* that is a char array cointining just \0 (string null-terminator). */
char newBuffer[256] = "";
/* same here, you always need to declare the size of a char array unless */
/* you initialize it like this -char newBuffer[] = "hello"-, in which case */
/* the size will automatically be 6 (I'll let you discover/understand */
/* why 6 and not 5). */
printf("Please enter a number: ");
fgets(buffer, 256, stdin); // nice link at the bottom on input reading
i = atoi(buffer);
printf("The value you entered is %d. Its double is %d.\n", i, i*2);
newBuffer = sCopy(buffer, i);
printf(newBuffer);
return 0;
}
/* I am not going to debate the idea of returning a char pointer here :) */
/* Remember that in this case you are returning a pointer to some memory that has */
/* been allocated somewhere inside your function and needs to be released (freed) */
/* by someone outside your control. Are they going to remember it? Are they */
/* going to do it? In this case "they" is "you" of course. */
/* I'll let you explore alternative approaches. */
const char *sCopy(char buffer[256], int i){
char nBuffer[256] = ""; // see above
char *t = NULL;
/* you always init a pointer to NULL. As you can see, initializing here will */
/* make you think that there might be problem with the strcat below. */
int x; // ok here you can omit the init, but be aware of it.
for(x = 0; x < i; x++){
strcat(t, buffer);
/* what are you missing here? this piece of code is supposed to concatenate the */
/* input buffer to a brand new buffer, pointed by your variable t. In your implementation */
/* t is just a pointer, which is nothing more than a number to a memory location */
/* With the initialization, the memory location you are pointing to is NULL, which */
/* if de-referenced, will cause massive problems. */
/* What you are missing is the blank slate where to write your data, to which your */
/* pointer will read from. */
}
//t = nBuffer;
return t;
}
我真的希望这会对你有所帮助。我很抱歉,但我不能写这个解决方案只是因为我认为如果你以艰难的方式学习它会更好。你可以找到很多关于char的指针教程,我相信你会解决这个问题。
答案 1 :(得分:0)
未分配char *t
的内存。您可以使用strdup
直接实现字符串副本。
char *newBuffer = NULL;
...
...
newBuffer = strdup(buffer);
答案 2 :(得分:0)
尝试
char* newBuffer; // point to a c-string // here the return value of sCopy
和
static char nBuffer[256]; // make nBuffer survive beyond function call
并使用n返回nBuffer
,而不是t
。
这是你可以做到的一种方式,没有分配。或者,分配内存并将其返回而不是static char
。
答案 3 :(得分:0)
尝试以下:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void sCopy(char buffer[256], int i, char newBuffer[], int size)
{
char *t;
for(int x = 0; x < i; x++){
strcat(newBuffer, buffer);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
char buffer[256] = {0};
char newBuffer[256] = {0};
printf("Please enter a number: ");
fgets(buffer, 256, stdin);
i = atoi(buffer);
printf("The value you entered is %d. Its double is %d.\n", i, i*2);
sCopy(buffer, i, newBuffer, 256);
printf("%s", newBuffer);
return 0;
}
请注意,fgets
会在输入字符串的末尾添加new line character
,因此如果输入6
,则字符串为0x36 0x0a
,其中0x36
为6
和0x0a
的ASCII代码是new line character
的ASCII代码,要删除此换行符,请参阅this link
答案 4 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *sCopy(char buffer[256], int i);
int main() {
int i;
int x;
char buffer[256];
const char* newBuffer;//[256];
printf("Please enter a number: ");
fgets(buffer, 256, stdin);
i = atoi(buffer);
printf("The value you entered is %d. Its double is %d.\n", i, i*2);
newBuffer = sCopy(buffer, i); //buffer tail '\n' need cut?
printf(newBuffer);
free(newBuffer);
return 0;
}
const char *sCopy(char buffer[256], int i){
char *t;
int x;
t=(char*)malloc(strlen(buffer)*i + 1);
*t='\0';
for(x = 0; x < i; x++){
strcat(t, buffer);
}
//t = nBuffer;
return (const char*)t;
}