为什么我的C程序会打印;(无效)“;在执行字符的tolower转换期间?
我写这个程序是为了更好地理解C。它可以工作,但由于某种原因,(null)在正确输出之前打印。我的代码:为什么我的C程序会打印;(无效)“;在执行字符的tolower转换期间?,c,null,fgets,tolower,C,Null,Fgets,Tolower,我写这个程序是为了更好地理解C。它可以工作,但由于某种原因,(null)在正确输出之前打印。我的代码: /* This program will take a string input input from the keyboard, convert the string into all lowercase characters, then print the result.*/ #include <stdio.h> #include <string.h> #incl
/* This program will take a string input input from the keyboard, convert the
string into all lowercase characters, then print the result.*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int i = 0;
/* A nice long string */
char str[1024];
char c;
printf("Please enter a string you wish to convert to all lowercase: ");
/* notice stdin being passed in for keyboard input*/
fgets(str, 1024, stdin); //beware: fgets will add a '\n' character if there is room
printf("\nYour entered string: \n\n%s\n", str);
printf("\nString converted to lowercase: \n\n%s\n");
while(str[i]) { //iterate str and print converted char to screen
c = str[i];
putchar(tolower(c));
i++;
}
putchar('\n'); //empty line to look clean
return 0;
}
与
以下是显示问题的示例输出:
Please enter a string you wish to convert to all lowercase: THE QUICK BROWN FOX
JUMPED OVER THE LAZY DOG.
Your entered string:
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
String converted to lowercase:
(null)
the quick brown fox jumped over the lazy dog.
Press any key to continue . . .
本打印声明:
printf("\nString converted to lowercase: \n\n%s\n");
格式字符串中有一个%s
,但您没有传递与之匹配的参数
幸运的是,恰好传递了0
,而您的printf
实现通过打印(null)
优雅地处理了这个问题。你在这里处于未定义的行为领域
如果启用更多警告标志,编译器可能会警告您此类问题。在这里的快速测试中,Clang甚至不需要任何标志:
$ clang example.c -o example
example.c:20:51: warning: more '%' conversions than data arguments [-Wformat]
printf("\nString converted to lowercase: \n\n%s\n");
~^
1 warning generated.
GCC也没有:
$ gcc example.c -o example
example.c: In function ‘main’:
example.c:20: warning: too few arguments for format
example.c:20: warning: too few arguments for format
啊,重复使用打印语句的危险。我不敢相信我盯着那条线看,却没有抓住。谢谢我正在使用Visual Studio 2012。我不知道如何让它发出警告。我刚刚试过你的程序@Satya,这个程序会导致未定义的行为,所以如果你尝试的话,你可能会(很可能?)看到不同的行为。非常感谢@CarlNorum这么漂亮的解释
$ clang example.c -o example
example.c:20:51: warning: more '%' conversions than data arguments [-Wformat]
printf("\nString converted to lowercase: \n\n%s\n");
~^
1 warning generated.
$ gcc example.c -o example
example.c: In function ‘main’:
example.c:20: warning: too few arguments for format
example.c:20: warning: too few arguments for format