C语言 打印整个指针



我试图得到一长串整数作为输入,如:

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003

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

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
}

可以为调试添加print语句:

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个字符或换行符,以先出现的字符为准,并正确地终止字符串,因此您无需担心这一点。如果目标缓冲区中有空间,它还会存储换行符,所以您需要注意这一点。

最新更新