[英]C's printf doesn't print a string (char array) out
我的问题基本上是使用 printf 打印一个字符数组。
在某些情况下,它会打印出结果:
int main(int argc, char** argv) {
char* orig = "@reveals#?the treasure chest#$President Barack H. Obama#";
printf("The input: %s\n", orig);
printf("The output: %s\n", reArrange(orig));
return (EXIT_SUCCESS);
}
有时不是:
int main(int argc, char** argv) {
char* orig = "@reveals#?the treasure chest#$President Barack H. Obama#";
printf("%s\n", reArrange(orig));
return (EXIT_SUCCESS);
}
这里是完整的代码(包括主要的function):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUBJECT '$'
#define ACTION '@'
#define OBJECT '?'
#define END '#'
char* reArrange(char* orig) {
int origSize = strlen(orig);
char subject[origSize], action[origSize], object[origSize];
//int i;
//for(i = 0; i < origSize; i++) {
// subject[i] = ' ';
// action[i] = ' ';
// object[i] = ' ';
//}
int subjectIndex = 0, actionIndex = 0, objectIndex = 0;
int timesEndCharShowUp = 0;
char state;
int i;
for(i = 0; i < origSize; i++) {
char ch = orig[i];
if(ch == SUBJECT) {
state = SUBJECT;
}
else if(ch == ACTION) {
state = ACTION;
}
else if(ch == OBJECT) {
state = OBJECT;
}
else if(ch == END) {
if(timesEndCharShowUp == 3) {
break;
}
else {
timesEndCharShowUp++;
}
}
else {
if(state == SUBJECT) {
subject[subjectIndex++] = ch;
}
else if(state == ACTION) {
action[actionIndex++] = ch;
}
else if(state == OBJECT) {
object[objectIndex++] = ch;
}
}
}
subject[subjectIndex] = '\0';
action[actionIndex] = '\0';
object[objectIndex] = '\0';
char rearranged[origSize];
sprintf(rearranged, "%s %s %s.\0", subject, action, object);
//printf("%s\n", rearranged);
orig = rearranged;
return orig;
}
int main(int argc, char** argv) {
char* orig = "@reveals#?the treasure chest#$President Barack H. Obama#";
// printf("The input: %s\n", orig);
// printf("The output: %s\n", reArrange(orig));
printf("result: ");
printf("%s\n", reArrange(orig) );
//fflush(stdout);
return (EXIT_SUCCESS);
}
您正在返回指向位于堆栈上的 memory 的指针。 在封闭的 function ( reArrange
) 返回后rearranged
不可用,并且可能包含垃圾。
您可能希望malloc
rearranged
或全局声明它。
让reArrange()
接受一个可以写入结果的缓冲区,而不是只返回一个char *
。 现在调用者必须为您的 function 提供合适的缓冲区,并且您对 memory 管理不再有任何问题。 您只需将 strncpy() 安排到缓冲区。 为了确保缓冲区足够大,用户还应该在第三个参数中提供缓冲区的大小:
char *rArrange(char *orig, char *result, int resultSize)
{
if (!result || resultSize == 0)
return NULL;
/* your code here */
strncpy(result, arranged, resultSize);
return result;
}
存储结果的替代malloc()
对用户来说不是很友好(用户必须 freemem() 缓冲区,但可能不知道这一点)。 使用静态/全局缓冲区不是非常线程安全的。
问题是您的 function reArrange
返回一个指向 memory 的指针,它不再控制。 返回rearranged
的数组的地址。 在返回发生后,这个数组实际上不再存在——memory 可以并且将会被重用。
解决您错误的快速技巧是将rearranged
为static
。 长期的解决方法是了解 C 的工作原理,并使用malloc()
或等效方法编写代码。
用char rearranged[origSize];
你创建了一个新的字符数组,一旦reArrange
终止,它就会从 scope 中消失。 所以在reArrange
的生命周期中, rearranged
是一个指向有意义的东西的指针; 因此, orig = rearranged
是有意义的。
但是一旦它超出 scope, reArrange(orig)
返回指向rearranged
的指针,这是一个现在rearranged
的悬空指针不再存在。
您的 function 需要两个参数:
char* reArrange(char* orig)
应该:
char* reArrange(char *rearragned, char* orig) {
// make your magic here!
}
调用顺序:
char input[SIZE];
char rearrange [SIZE];
// initialize everything! Don't forget to rearrange[0] ='\0\;!!!
rearrange(rearranged, input);
// do you printing....
您还应该学习如何正确使用指针并查找“开关”。
您确定以下代码部分有效吗?
char* reArrange(char* orig) {
int origSize = strlen(orig);
char subject[origSize], action[origSize], object[origSize];
我的意思是origSize
必须是const
它不能是动态值。 您应该使用malloc
为subject, action and object
分配空间。 此外,您可能会考虑一些准则:
1 代替:
for(i = 0; i < origSize; i++) {
char ch = orig[i];
if(ch == SUBJECT) {
state = SUBJECT;
}
你可以有:
char ch;//declare char ch outside for loop
for(i = 0; i < origSize; i++) {
ch = orig[i];
if(ch == SUBJECT) {
state = SUBJECT;
}
2 您可能喜欢使用switch
语句而不是if
,这将使您的代码看起来很棒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.