0

我需要检查我的程序是否在我的字符串中正确输入了这些字符,那么我如何才能看到这些字符未解析但实际显示的“原始”字符串?

4

5 回答 5

5

如果您读取输入(来自文件或来自用户),则不会解析特殊转义码。编译器仅对源代码中的字符串和字符文字进行特殊处理。

编辑:带有输入和输出的简单示例程序来显示我在说什么。

#include <stdio.h>
#include <string.h>

int main(int ac, char *av[])
{
    char input[32];

    printf("Enter input: ");
    fgets(input, sizeof(input), stdin);

    /* Remove trailing newline */
    if (input[strlen(input) - 1] == '\n')
        input[strlen(input) - 1] = '\0';

    printf("input is \"%s\"\n", input);

    return 0;
}

上述程序的示例运行:

输入输入: foo\nbar\thello
输入是“foo\nbar\thello”

该函数fgets将实际的换行符留在字符串的末尾。但是,输入中的序列\n\t输入不会转换为换行符或制表符(分别)。那是因为处理这些特殊字符序列的不是输入或输出函数,而是编译器。

如果您在源代码中的字符串或字符文字中有这些序列,那么编译器会识别这些序列并将它们更改为适当的换行符、制表符或您编写的任何内容。但是,由于编译器对从文件或用户读取的输入一无所知,因此不会翻译这些序列。

编辑 2:如果您想知道如何在字符串中显示文字特殊字符,请查看此程序:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void print_raw_string(const char *str)
{
    while (*str != '\0')
    {
        if (isprint(*str))
            fputc(*str, stdout);
        else
        {
            switch (*str)
            {
                /* First check for known special sequences */
            case '\0':
                printf("\\0");
                break;
            case '\a':
                printf("\\a");
                break;
            case '\b':
                printf("\\b");
                break;
            case '\t':
                printf("\\t");
                break;
            case '\n':
                printf("\\n");
                break;
            case '\v':
                printf("\\v");
                break;
            case '\f':
                printf("\\f");
                break;
            case '\r':
                printf("\\r");
                break;

            default:
                /* None of the above, print it out as a hex escape sequence */
                printf("\\x%02x", *str);
                break;
            }
        }

        str++;
    }
}

int main(int ac, char *av[])
{
    char input[32];

    printf("Enter input: ");
    fgets(input, sizeof(input), stdin);

    printf("Input is: ");
    print_raw_string(input);
    printf("\n");

    return 0;
}

运行程序时:

输入输入:foo bar
输入是: foo\tbar\n
于 2012-10-25T11:06:38.850 回答
2

一种可能的解决方案是打印字符串中内容的ASCII值,无论它是固定字符串还是来自stdin

char str[] = "A\tBC1\n";
int j;
for(j = 0; j<strlen(str); str++)
  printf("%#x ", str[j]);

输出:

>>0x41 0x9 0x42 0x43 0x31 0xA

从标准输入:

fgets(str, 5, stdin);
for(j = 0; j<strlen(str); j++)
  printf("%#x ", str[j]);

输入输出:

>> 1   2         <---- That's a tab between 1 and 2
>> 0x31 0x9 0x32 0xA

您可以花哨并转义字符以显示\t(0x9) 和\n(0xA) 而不是原始值,但如果您只是想验证您是否正在获取它们,这应该可以工作(并且更快)

于 2012-10-25T11:45:45.137 回答
1

您可以转义字符,也可以编写自己的特殊例程,如下所示:

void print_raw(const char *ch)
{
   char *d = ch;
   while(*d){
     switch(*d){
       case '\n':
           printf("\\n");
       break;
       case '\v':
           printf("\\n");
       break;
       case '\r':
       printf("\\r");
           break;
       case '\a':
       printf("\\a");
           break;
       case '\?':
       printf("\\?");
           break;
       case '\"':
       printf("\"");
           break;
       case '\t':
       printf("\\t");
           break;
       case '\b':
       printf("\\b");
           break;
       case '\f':
       printf("\\f");
           break;
       case '\\':
       printf("\\");
           break;
       case '\'':
       printf("\'");
           break;
       default:
          putchar(d);
    }
}
于 2012-10-25T11:07:57.190 回答
0

只需将字符串打印为字符序列,例如:

str 是您的字符串:

char *ptr = str;
while(*ptr != 0)
{
   print("%02X", *ptr);
   ptr++;
}



于 2012-10-25T11:10:37.217 回答
0

Printf 没有对 \n 等做任何特别的事情。这些字符序列由编译器解释。试试这个:

$ cat foo.c
#include <stdio.h>
#include <string.h>

int
main(int argc, char **argv)
{
    if (argc != 2)
        return 1;
    printf("%d\n", (int)strlen(argv[1]));
    printf("%d\n", (int)strlen("\n"));
    printf("[%s]\n", argv[1]);

    return 0;
}
$ cc -Wall -O2 -o foo foo.c && ./foo '\n'
2
1
[\n]
$ 

请注意,我在调用 foo 时转义了 \n ,因为如果没有转义,shell 会解释 \ (不同)。

于 2012-10-25T11:23:13.740 回答