c - 打印整个指针

标签 c pointers encryption malloc

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

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 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可以吗?不要忘记,不允许使用数组!

最佳答案

根据问题的描述,您不需要一次读取和存储 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
}

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

话虽如此,我想通过您的代码指出一些事情。

正如其他人在评论中指出的,您需要为字符串终止符保留至少一个元素,因此您要么需要分配 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 个字符或换行符(以先到者为准),并正确终止字符串,因此您无需担心这一点。如果目标缓冲区中有空间,它还会存储换行符,因此您需要注意这一点。

关于c - 打印整个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66370621/

相关文章:

c++ - 我们可以打乱 C 或 C++ 中的声明顺序吗?

c - 访问二维结构数组上的值

c - 如何在 struct 内部和 main 外部分配内存?

android - 直接使用从 keystore 加载的 SecretKey 时, key 用户未通过身份验证

c - 我无法将一些 C 代码转换为 Delphi

arrays - 在 C 中实现 memset 以设置整个字而不是逐字节设置

c++ - 为什么在 C++ 命名空间周围使用 extern "C"

c++ - 为什么我的链表分配不能正常工作?

javascript - Node js通过公钥加密值错误TypeError : Data must be a buffer

CipherSaber 漏洞