繁体   English   中英

C 的 printf 不打印字符串(字符数组)

[英]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 可以并且将会被重用。

解决您错误的快速技巧是将rearrangedstatic 长期的解决方法是了解 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它不能是动态值。 您应该使用mallocsubject, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM