2

我是一名正在上课的初学者程序员,我无法让我的输出字符串在单词之间带有空格来打印。下面是我的代码。它应该采用我输入的字符串,并在我运行程序时更改为全部大写或全部小写。如果我输入 MY CODE DOES NOT WORK,它会输出 mycodedoesnotwork。为什么要删除空格?

 1 #include <stdio.h>
 2 #include <assert.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5
 6
 7 int shout(char * msgIn, char * msgOut) {
 8
 9         if (!msgIn || !msgOut)
 10                 return -1;
 11         while (*msgIn != '\0') {
 12                 if ('a' <= *msgIn && *msgIn <= 'z')
 13                         *msgOut = *msgIn + ('A' - 'a');
 14                 else
 15                         *msgOut = *msgIn;
 16                 msgIn++;
 17                 msgOut++;
 18         }
 19         *msgOut = '\0';
 20
 21         return 0;
 22 }
 23
 24
 25 int whisper(char const * msgIn, char * msgOut) {
 26         if (!msgIn || !msgOut)
 27                 return -1;
 28         while (*msgIn != '\0') {
 29                 if ('A' <= *msgIn && *msgIn <= 'Z')
 30                         *msgOut = *msgIn + ('a' - 'A');
 31                 else
 32                         *msgOut = *msgIn;
 33                 msgIn++;
 34                 msgOut++;
 35         }
 36         *msgOut = '\0';
 37         return 0;
 38 }
 39
 40 int main(int argc, char ** argv) {
 41         char in[128], out[128];
 42         int i;
 43         for (i = 1; i < argc; i++) {
 44                 if (strcmp("-w", argv[i]) == 0)
 45                         while (scanf("%s", in) != EOF) {
 46                                 whisper(in, out);
 47                                 printf("%s", out);
 48                         }
 49                 else if (strcmp("-s", argv[i]) == 0)
 50                         while (scanf("%s", in) != EOF) {
 51                                 shout(in, out);
 52                                 printf("%s", out);
 53                         }
 54         }
 55         printf("\n");
 56         return 0;
 57 }

~

~

4

4 回答 4

1

scanf调用仅读取单词(无空格),并且在输出字符串时不会添加空格。

如果您不介意尾随空格,只需将第 47 和 52 行更改为printf("%s ", out)

于 2013-10-04T10:21:56.157 回答
1

while (scanf("%s", in) != EOF)==>scanf()将输入带到空间并发送到函数

然后在下一次迭代中再次使用空格后的单词。

你需要fgets()改用。

于 2013-10-04T10:22:27.050 回答
0

这不是您的shout()orwisper()功能的问题,而是scanf().

当您指定%s读取字符串时,字符串将在任何空白字符处终止 - 空格、制表符等。

这不会包含在字符串中。因此,您在字符串之间输入的空间不会存储在in变量中。

您可能想考虑不同的方法来解决这个问题。

于 2013-10-04T10:23:12.470 回答
0

空格是字符串终止符,scanf()不包含scanf()在获取的字符串中。男人 3 扫描

于 2013-10-04T10:26:26.693 回答