我有学校的任务。要反转句子中的每个单词,例如:
输入: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哈希中确实完全相同。
答案 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;
}