没有输出是为什么?
Getting no output why is that?
我',正在学习 C,但由于某种原因我没有得到任何输出,可能我没有 return 我应该做的,但我应该怎么做? (在下面的评论中描述了问题:D)
感谢您的帮助!
#include <stdio.h>
#include <ctype.h>
#include <string.h>
char *makeUpperCase (char *string);
int main()
{
printf(makeUpperCase("hello")); //Here there is no output, and when I'm trying with the format %s it returns null
return 0;
}
char *makeUpperCase(char *string)
{
char str_out[strlen(string) + 1];
for (int i = 0; i < strlen(string); ++i)
str_out[i] = toupper(string[i]);
printf(str_out); //Here I get the output.
return str_out;
}
您在函数中声明了一个局部变长数组,该数组在退出函数后将不再存在
char str_out[strlen(string) + 1];
所以你的程序有未定义的行为。
如果函数参数声明时没有限定符 const
那么这意味着函数会更改传递的字符串。这样的函数可以这样定义
char * makeUpperCase( char *string )
{
for ( char *p = string; *p != '[=11=]'; ++p )
{
*p = toupper( ( unsigned char )*p );
}
return string;
}
否则你需要动态分配一个新的字符串。例如
char * makeUpperCase( const char *string )
{
char *str_out = malloc( strlen( string ) + 1 );
if ( str_out != NULL )
{
char *p = str_out;
for ( ; *string != '[=12=]'; ++string )
{
*p++ = toupper( ( unsigned char )*string );
}
*p = '[=12=]';
}
return str_out;
}
这是一个演示程序。
#include <stdop.h>
#include <stdlib.h>
#include <string.h>
char *makeUpperCase( const char *string )
{
char *str_out = malloc( strlen( string ) + 1 );
if (str_out != NULL)
{
char *p = str_out;
for (; *string != '[=13=]'; ++string)
{
*p++ = toupper( ( unsigned char )*string );
}
*p = '[=13=]';
}
return str_out;
}
int main( void )
{
char *p = makeUpperCase( "hello" );
puts( p );
free( p );
}
程序输出为
HELLO
问题是 printf()
是基于一种有点复杂的机制来缓冲输出。当您输出到终端时,printf()
只是缓冲所有内容,直到缓冲区填满(仅字符串 "hello"
不会发生这种情况,或者直到它接收到 '\n'
字符(这你没有在你的陈述中使用)
因此,要强制刷新缓冲区,只需添加以下语句
fflush(stdout);
在你的 printf()
电话之后。
我',正在学习 C,但由于某种原因我没有得到任何输出,可能我没有 return 我应该做的,但我应该怎么做? (在下面的评论中描述了问题:D) 感谢您的帮助!
#include <stdio.h>
#include <ctype.h>
#include <string.h>
char *makeUpperCase (char *string);
int main()
{
printf(makeUpperCase("hello")); //Here there is no output, and when I'm trying with the format %s it returns null
return 0;
}
char *makeUpperCase(char *string)
{
char str_out[strlen(string) + 1];
for (int i = 0; i < strlen(string); ++i)
str_out[i] = toupper(string[i]);
printf(str_out); //Here I get the output.
return str_out;
}
您在函数中声明了一个局部变长数组,该数组在退出函数后将不再存在
char str_out[strlen(string) + 1];
所以你的程序有未定义的行为。
如果函数参数声明时没有限定符 const
那么这意味着函数会更改传递的字符串。这样的函数可以这样定义
char * makeUpperCase( char *string )
{
for ( char *p = string; *p != '[=11=]'; ++p )
{
*p = toupper( ( unsigned char )*p );
}
return string;
}
否则你需要动态分配一个新的字符串。例如
char * makeUpperCase( const char *string )
{
char *str_out = malloc( strlen( string ) + 1 );
if ( str_out != NULL )
{
char *p = str_out;
for ( ; *string != '[=12=]'; ++string )
{
*p++ = toupper( ( unsigned char )*string );
}
*p = '[=12=]';
}
return str_out;
}
这是一个演示程序。
#include <stdop.h>
#include <stdlib.h>
#include <string.h>
char *makeUpperCase( const char *string )
{
char *str_out = malloc( strlen( string ) + 1 );
if (str_out != NULL)
{
char *p = str_out;
for (; *string != '[=13=]'; ++string)
{
*p++ = toupper( ( unsigned char )*string );
}
*p = '[=13=]';
}
return str_out;
}
int main( void )
{
char *p = makeUpperCase( "hello" );
puts( p );
free( p );
}
程序输出为
HELLO
问题是 printf()
是基于一种有点复杂的机制来缓冲输出。当您输出到终端时,printf()
只是缓冲所有内容,直到缓冲区填满(仅字符串 "hello"
不会发生这种情况,或者直到它接收到 '\n'
字符(这你没有在你的陈述中使用)
因此,要强制刷新缓冲区,只需添加以下语句
fflush(stdout);
在你的 printf()
电话之后。