我需要帮助旋转单词,以便输出最后的第一个字母。 我有一个名为flip.txt的文件
backpack
carpet
rotate
我希望能够输入./RotateWord< flip.txt(在终端中),它应该输出
ackpackb
arpetc
otater
我能够输出缺少第一个字母的单词。如何让它输出结尾的第一个字母?
继承我的代码
#include <stdio.h>
#define BUFFER_SIZE 81
int main(int argc, char **argv) {
char string[BUFFER_SIZE];
while(fgets(string, BUFFER_SIZE, stdin) > 0) {
int numChars = 0;
while(string[numChars] && string[numChars] != '\n')
++numChars;
int i;
for(i = 1; i < numChars; ++i){
if (string[i] == '\n'){
putchar(string[0]);
putchar('\n');
}
else {
putchar(string[i]);
}
}
putchar('\n');
fflush(stdout);
}
return 0;
}
答案 0 :(得分:1)
您可以使用strcspn
删除\n
。
string[strcspn(string,"\n")]=0;
如果要以这种方式打印字符串 - 请执行以下两行。 (您也可以将它合并为一行)。
printf("%s",string+1);
printf("%c\n",string[0]);
代码将是
while(fgets(string, BUFFER_SIZE, stdin) != NULL) {
string[strcspn(string,"\n")]=0;
printf("%s%c\n",string+1,string[0]);
fflush(stdout);
}
根据您的代码,if
块从不执行。所以你永远不会打印第一个字符。前一个loop
只是在变量不符合\n
时递增变量。然后在下一个循环中迭代它们 < numChars
,然后期望看到\n
,现在情况不是这样。
while(fgets(string, BUFFER_SIZE, stdin) != NULL) {
for(int i = 1; string[i]; ++i){
if (string[i] == '\n'){
putchar(string[0]);
putchar('\n');
}
else {
putchar(string[i]);
}
}
fflush(stdout);
}
之前您在每个打印的字符后放\n
。它应该只在最后一个字符之后。
fgets
返回char*
- 如果出现错误,则返回NULL
。因此,要检查fgets
是否成功,您应该进行空检查。
答案 1 :(得分:1)
当你
时,你可能没有计算最后的'\ n'字符while(string[numChars] && string[numChars] != '\n')
++numChars;
如果是这样,你永远不会打
if (string[i] == '\n'){
putchar(string[0]);
putchar('\n');
}
因为你的循环会提早停止。
答案 2 :(得分:0)
在for循环中运行
for(i=1,i<=numChars,i++)
这是因为if语句没有被执行,因为索引没有到达换行符。 因此完整的代码如下:
#include <stdio.h>
#define BUFFER_SIZE 81
int main(int argc, char **argv) {
char string[BUFFER_SIZE];
while(fgets(string, BUFFER_SIZE, stdin) > 0) {
int numChars = 0;
while(string[numChars] && string[numChars] != '\n')
++numChars;
int i;
for(i = 1; i <= numChars; ++i){
if (string[i] == '\n'){
putchar(string[0]);
putchar('\n');
}
else {
putchar(string[i]);
}
}
//putchar('\n');
fflush(stdout);
}
return 0;
}
也不需要额外的
putchar('\n');