C语言 在最后一个单词的末尾添加额外的空格

eyh26e7m  于 2024-01-06  发布在  其他
关注(0)|答案(1)|浏览(262)

这是我的代码。它应该写下每一个第二个单词,从START到STOP,从一个文件到另一个文件。代码工作正常,但在最后一个单词的末尾有一个额外的空格。有什么建议吗?我尝试了一些东西,但最终只在前面有额外的空格,没有空格,或者多个不需要的空格。

  1. #include <stdio.h>
  2. #define MAX_BUFFER_SIZE 100
  3. typedef struct {
  4. FILE *inputFile;
  5. FILE *outputFile;
  6. } FilePair;
  7. void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName);
  8. void closeFiles(FilePair *files);
  9. void processFile(FilePair *files);
  10. int main(int argc, char *argv[]) {
  11. FilePair files;
  12. initializeFiles(&files, argv[1], argv[2]);
  13. if (files.inputFile == NULL || files.outputFile == NULL) {
  14. return 1;
  15. }
  16. processFile(&files);
  17. closeFiles(&files);
  18. return 0;
  19. }
  20. void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName) {
  21. files->inputFile = fopen(inputFileName, "r");
  22. files->outputFile = fopen(outputFileName, "w");
  23. if (files->inputFile == NULL || files->outputFile == NULL) {
  24. char error[] = "Error opening files\n";
  25. for (int i = 0; error[i] != '\0'; i++) {
  26. fputc(error[i], files->outputFile);
  27. }
  28. fclose(files->outputFile);
  29. files->outputFile = NULL;
  30. fclose(files->inputFile);
  31. files->inputFile = NULL;
  32. return;
  33. }
  34. }
  35. void closeFiles(FilePair *files) {
  36. if (files->inputFile != NULL) {
  37. fclose(files->inputFile);
  38. files->inputFile = NULL;
  39. }
  40. if (files->outputFile != NULL) {
  41. fclose(files->outputFile);
  42. files->outputFile = NULL;
  43. }
  44. }
  45. void processFile(FilePair *files) {
  46. char startMarker[7] = "START ";
  47. char stopMarker[5] = "STOP";
  48. char buffer[MAX_BUFFER_SIZE];
  49. int startIdx = 0, stopIdx = 0;
  50. int isStart = 0;
  51. int spaceCount = 0;
  52. while (1) {
  53. int character = fgetc(files->inputFile);
  54. if (character == EOF) {
  55. break;
  56. }
  57. for (int i = 0; i < MAX_BUFFER_SIZE; i++) {
  58. buffer[i] = '\0';
  59. }
  60. buffer[0] = character;
  61. for (int i = 1; i < MAX_BUFFER_SIZE - 1; i++) {
  62. character = fgetc(files->inputFile);
  63. if (character == EOF || character == '\n') {
  64. break;
  65. }
  66. buffer[i] = character;
  67. }
  68. for (int i = 0; buffer[i] != '\0'; i++) {
  69. char ch = buffer[i];
  70. if (isStart) {
  71. if (spaceCount % 2 != 0) {
  72. fputc(ch, files->outputFile);
  73. }
  74. if (ch == ' ') {
  75. spaceCount++;
  76. }
  77. if (ch == stopMarker[stopIdx]) {
  78. stopIdx++;
  79. } else {
  80. stopIdx = 0;
  81. }
  82. if (stopMarker[stopIdx] == '\0') {
  83. isStart = 0;
  84. }
  85. } else {
  86. if (ch == startMarker[startIdx]) {
  87. startIdx++;
  88. } else {
  89. startIdx = 0;
  90. }
  91. if (startMarker[startIdx] == '\0') {
  92. isStart = 1;
  93. }
  94. }
  95. }
  96. }
  97. }

字符串
我只是想去掉最后一个词末尾的空格

tp5buhyn

tp5buhyn1#

你可以稍微修改一下你的逻辑,去掉最后一个单词末尾的多余空格。一种方法是维护一个标志来检查当前单词是否是最后一个单词。

修改代码如下:

  1. #include <stdio.h>
  2. #define MAX_BUFFER_SIZE 100
  3. typedef struct {
  4. FILE *inputFile;
  5. FILE *outputFile;
  6. } FilePair;
  7. void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName);
  8. void closeFiles(FilePair *files);
  9. void processFile(FilePair *files);
  10. int main(int argc, char *argv[]) {
  11. FilePair files;
  12. initializeFiles(&files, argv[1], argv[2]);
  13. if (files.inputFile == NULL || files.outputFile == NULL) {
  14. return 1;
  15. }
  16. processFile(&files);
  17. closeFiles(&files);
  18. return 0;
  19. }
  20. void initializeFiles(FilePair *files, char *inputFileName, char *outputFileName) {
  21. files->inputFile = fopen(inputFileName, "r");
  22. files->outputFile = fopen(outputFileName, "w");
  23. if (files->inputFile == NULL || files->outputFile == NULL) {
  24. char error[] = "Error opening files\n";
  25. for (int i = 0; error[i] != '\0'; i++) {
  26. fputc(error[i], files->outputFile);
  27. }
  28. fclose(files->outputFile);
  29. files->outputFile = NULL;
  30. fclose(files->inputFile);
  31. files->inputFile = NULL;
  32. return;
  33. }
  34. }
  35. void closeFiles(FilePair *files) {
  36. if (files->inputFile != NULL) {
  37. fclose(files->inputFile);
  38. files->inputFile = NULL;
  39. }
  40. if (files->outputFile != NULL) {
  41. fclose(files->outputFile);
  42. files->outputFile = NULL;
  43. }
  44. }
  45. void processFile(FilePair *files) {
  46. char startMarker[7] = "START ";
  47. char stopMarker[5] = "STOP";
  48. char buffer[MAX_BUFFER_SIZE];
  49. int startIdx = 0, stopIdx = 0;
  50. int isStart = 0;
  51. int spaceCount = 0;
  52. int lastWord = 0;
  53. while (1) {
  54. int character = fgetc(files->inputFile);
  55. if (character == EOF) {
  56. break;
  57. }
  58. for (int i = 0; i < MAX_BUFFER_SIZE; i++) {
  59. buffer[i] = '\0';
  60. }
  61. buffer[0] = character;
  62. for (int i = 1; i < MAX_BUFFER_SIZE - 1; i++) {
  63. character = fgetc(files->inputFile);
  64. if (character == EOF || character == '\n') {
  65. lastWord = 1; // Mark that this is the last word
  66. break;
  67. }
  68. buffer[i] = character;
  69. }
  70. for (int i = 0; buffer[i] != '\0'; i++) {
  71. char ch = buffer[i];
  72. if (isStart) {
  73. if (spaceCount % 2 != 0) {
  74. fputc(ch, files->outputFile);
  75. }
  76. if (ch == ' ') {
  77. spaceCount++;
  78. }
  79. if (ch == stopMarker[stopIdx]) {
  80. stopIdx++;
  81. } else {
  82. stopIdx = 0;
  83. }
  84. if (stopMarker[stopIdx] == '\0') {
  85. isStart = 0;
  86. }
  87. } else {
  88. if (ch == startMarker[startIdx]) {
  89. startIdx++;
  90. } else {
  91. startIdx = 0;
  92. }
  93. if (startMarker[startIdx] == '\0') {
  94. isStart = 1;
  95. }
  96. }
  97. }
  98. if (lastWord) {
  99. // Check if this is the last word and avoid adding an extra space
  100. fputc('\n', files->outputFile);
  101. break;
  102. }
  103. }
  104. }

字符串
引入lastWord变量是为了跟踪当前单词是否是最后一个单词。如果它是最后一个单词,它可以避免在末尾添加额外的空格。此外,它会在输出文件中添加一个换行符以保持干净的输出。我希望这有助于解决您的错误。如需更多帮助,请在下面评论。

展开查看全部

相关问题