【问题标题】:Printing a whole pointer打印整个指针
【发布时间】:2021-02-25 14:36:53
【问题描述】:

我正在尝试获取一长串整数作为输入,例如:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003

但不允许使用数组。所以我决定在指针的帮助下接受它们。

0, 1, 2, 3, 4, 5, 6 这些整数分别代表'', '-', '_', '|', '/', '\', 'O'

这意味着,1应该被翻译成''(空格)或者2应该被翻译成'-'

我被要求编写一个函数来读取这些整数文件,如上解密它们并可视化 新形式。在将它们翻译成新的形式之前,我想确保我正确地使用它们并且我也希望能够正确地打印它们。

char *p = malloc(1000);
scanf("%1000s",p);
for(; *p != '\n'; p++)
    printf("%c",*p);

当我输入abc 作为输入时,编译器给了我这个输出: abcabc

为什么会这样?像这样使用 malloc 可以吗?别忘了,数组是不允许的!

【问题讨论】:

  • %s 不会存储换行符 '\n'*p != '\n' 应该是 *p != '\0'
  • 另外%1000s 应该是%999smalloc(1000) 应该是malloc(1001) 以保留终止空字符的空间。
  • 嗯...使用calloc() 来避免使用malloc()?
  • 你知道当你使用一个指针作为来自malloc的返回值时,你把它作为一个数组的第一个元素的指针吗?
  • @nicholai_hel:这只是一个评论。根本不使用数组,您根本无法处理对象序列,因为指针算术仅在数组内部有效。我假设要求是只使用动态数组,否则只有魔法可以帮助......

标签: c pointers encryption malloc


【解决方案1】:

根据问题的描述,您不需要一次读取和存储 1000 个字符 - 您应该能够读取每个字符并即时翻译:

for ( int c = fgetc( input ); c != EOF; c = fgetc( input ) )
{ 
  // transform c and output the result here
}

可以添加打印语句进行调试:

for ( int c = fgetc( input ); c != EOF; c = fgetc( input ) )
{
  fprintf( stderr, "%c", c ); 
  // transform c and output the result here
}

这是过滤器或翻译器的常用方法。

话虽如此,我想用你的代码指出一些事情。

正如其他人在 cmets 中指出的那样,您需要为字符串终止符保留至少一个元素,因此您需要分配 1001 个元素并读取 1000,或者分配 1000 个元素并读取 999:

char *p = malloc( 1000 );
scanf( "%999s", p );

但还有另一个问题 - 你编写循环的方式

for(; *p != '\n'; p++)
    printf("%c",*p);

您正在修改 p - 当您将其作为参数传递给 free 时,它将失败,因为它不是 malloc 返回的指针值。您需要保留从 malloc 返回的指针,并使用单独的指针遍历数组,或使用数组索引表示法:

for ( char *tmp = p; *tmp != 0; tmp++ )
  printf( "%c", *tmp );

for( size_t i = 0; p[i] != 0; i++ )
  printf( "%c", p[i] );

另外,%s 告诉scanf 在下一个空白字符处停止输入 - 它不会将'\n' 或任何其他空白字符存储到字符串中。正如我在上面显示的那样,您需要阅读 0 终止符。

如果你确实想要包含空格,你最好使用fgets(对于这个问题,你最好还是使用fgets):

if ( fgets( p, 1000, input ) )
{
  // transform contents of p
}
else
{
  // error or EOF on input
}

fgets 将读取最多 999 个字符或换行符,以先到者为准,并正确终止字符串,因此您无需担心。如果目标缓冲区中有空间,它还会存储换行符,因此您需要注意这一点。

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多