比较代码中的每个单词的反向代码

时间:2017-08-22 05:31:25

标签: c

我有学校的任务。要反转句子中的每个单词,例如:

输入:Fried chicken, fried duck.

输出:deirF nekcihc, deirf kcud.

除了点和逗号之外,它没有被逆转。

第一个代码

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

int main() {
    int i, n, titik = 0, coma = 0;
    char s[5001];
    char c[5001];
    char *tok;
    scanf("%[^\n]s", s);
    if (s[0] == ' ')
        printf(" ");
    tok = strtok(s, " ");
    while (tok != NULL) {
        strcpy(c, tok);
        n = strlen(c);
        for (i = n; i >= 0; i--) {
            if (c[i] == ',') {
                coma = 1;
            } else
            if (c[i] == '.') {
                titik = 1;
            } else 
                printf("%c", c[i]);
        }
        if (coma) {
            printf(",");
            coma = 0;
        } else
        if (titik){
            printf(".");
            titik = 0;
        }
        tok = strtok(NULL," ");
        if (tok == NULL)
            printf("\n");
        else
            printf(" ");
    }
}

第二个代码是

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

int main() {
    int i, j, n, prana = 0, titik = 0, coma = 0, end = 0;
    char s[5001];
    scanf("%[^\n]s", s);
    n = strlen(s);

    for (i = 0; i <= n; i++) {
        if (isspace(s[i]) || iscntrl(s[i])) {
            if (iscntrl(s[i]))
                end = 1;

            for (j = i - 1; j >= prana; j--) {
                if (s[j] == '.') {
                    titik = 1;
                } else
                if (s[j] == ',') {
                    coma = 1;
                } else
                    printf("%c", s[j]);
            }
            prana = i + 1;
            if (titik) {
                titik = 0;
                if (end)
                    printf(".");
                else
                    printf(". ");
            } else
            if (coma) {
                coma = 0;
                if (end)
                    printf(",");
                else
                    printf(", ");
            } else {
                if (end)
                    printf("");
                else
                    printf(" ");
            }
        }
    }
    printf("\n");
    return 0;
}

为什么在测试用例中接受第二个代码?,但第一个代码不是。 我测试的结果是一样的。在md5哈希中确实完全相同。

1 个答案:

答案 0 :(得分:2)

两个代码的输出ID不同,因为您在第一个代码中为每个标记打印终止空字符。这个循环:

for (i = n; i >=0 ; i--) ...

在第一次迭代中会有i == n。对于长度为n的C字符串,s [n]为终止空值。此字符可能不会显示在控制台中,但它是输出的一部分。

要修复循环,可以从i = n - 1开始,但C使用包含下限和独占上限,并且更多的idomatic循环语法是:

i = n;
while (i-- > 0) ...

与您手头的问题无关,但您的代码相当复杂,因为它们依赖于许多假设:用空格分隔的单词;只有标点符号是逗号或停止;重复的标点符号被忽略,特殊情况为最后一个单词。

这是一个解决方案,将所有字母字符块加上撇号作为单词并将其反转到位:

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

void reverse(char *str, int i, int j)
{
    while (i < j) {
        int c = str[--j];

        str[j] = str[i];
        str[i++] = c;
    }
}

int main()
{
    char str[512];
    int begin = -1;
    int i;

    if (fgets(str, sizeof(str), stdin) == NULL) return -1;

    for (i = 0; str[i]; i++) {
        if (isalpha((unsigned char) str[i]) || str[i] == '\'') {
            if (begin == -1)  begin = i;
        } else {
            if (begin != -1) {
                reverse(str, begin, i);
                begin = -1;
            }
        }
    }

    printf("%s", str);

    return 0;
}