2

我编写这个程序是为了更好地理解 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>
#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;
}

顺便说一句,我注意到,如果将我的字符串变量添加到最后一个 printf 函数,问题就消失了。

代替:

printf("\nString converted to lowercase: \n\n%s\n"); 

printf("\nString converted to lowercase: \n\n%s\n, str");

这是显示问题的示例输出:

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 . . .
4

1 回答 1

6

此打印声明:

printf("\nString converted to lowercase: \n\n%s\n");

在格式字符串中有一个%s,但您没有传递一个参数来匹配它。

您很幸运 a0恰好被通过,并且您的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
于 2013-06-05T05:54:17.243 回答