打印整个指针
Printing a whole pointer
我正在尝试获取一长串整数作为输入,例如:
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003
但不允许使用数组。所以我决定在指点的帮助下接受他们。
0, 1, 2, 3, 4, 5, 6 这些整数中的每一个代表' ', '-', '_', '|', '/', '\', 'O'
这意味着,1 应该翻译成 ' '(space) 或 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 个字符或换行符,以先到者为准,并正确终止字符串,因此您无需担心。如果目标缓冲区中有空间,它还会存储换行符,因此您需要注意这一点。
我正在尝试获取一长串整数作为输入,例如:
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003
但不允许使用数组。所以我决定在指点的帮助下接受他们。
0, 1, 2, 3, 4, 5, 6 这些整数中的每一个代表' ', '-', '_', '|', '/', '\', 'O'
这意味着,1 应该翻译成 ' '(space) 或 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 个字符或换行符,以先到者为准,并正确终止字符串,因此您无需担心。如果目标缓冲区中有空间,它还会存储换行符,因此您需要注意这一点。