【问题标题】:swapping int with string using getchar() and putchar()使用 getchar() 和 putchar() 将 int 与字符串交换
【发布时间】:2018-10-20 09:24:09
【问题描述】:

对于我的作业,我必须与一个角色进行交换和诠释。例如,如果用户输入 1,则输出应为“一”。这应该从 0 到 5 有效。

我的想法是实现一个看起来像这样的 char 数组。

*string[] = { "zero\0", ....., "five\0"}

然后我会用这样的代码来实现它。

#include <stdio.h>

int main() 
{
    int c; 
    while((c=getchar())!=EOF)
    {
        putchar(c);
    }

    return 0; 
}

所以因为我只被允许使用 putchar 和 getchar 而没有堆。 这将是我的方法:我将创建一个 for 循环,该循环将打印出每个字母,直到达到 \0。

这是正确的方法吗?

【问题讨论】:

  • 这种方式好像根本不用字符串。
  • 1) 字符串文字已经以 null 结尾,您不应在末尾添加另一个 \0。 2) 如果i == 0,则string[i] 将评估为"zero"(或者,在您的情况下为"zero\0")。
  • @IncreasinglyIdiotic:按照我的阅读方式,当用户输入1 时,OP 想要打印one。字符串文字 "one" 已经包含 4 个字符,最后一个是 '\0'

标签: c arrays string pointers replace


【解决方案1】:

您在正确的轨道上,但这里有一些建议。

我不确定*string[] 是什么,但是因为您提前知道数组的大小,所以您可以制作一个固定大小的char* 数组来保存这样的字符串

char* arr[6] = {"zero\0", "one\0", ..., "five\0"};

请注意,该数组同时具有类型 (char*) 和名称 (arr)。

接下来你可以读入你想打印的号码

int c = getchar();

您可以使用之前定义的数组来获取正确的字符串并在其上循环使用putchar 一次打印一个字符

char* str = arr[c];
for (int i = 0; str[i] != '\0'; i++) {
    putchar(str[i]);
}
putchar('\n');

正如Groo 指出的那样,字符串文字是隐式以空值结尾的,因此您不需要在字符串中包含\0。数组可以只是

char* arr[6] = {"zero", "one", ..., "five"};

一切都会正常进行。

【讨论】:

  • 非常感谢,我包含了一个 if(c==48) 并更改了 char* str = arr[c];到 char* str = arr[0];它奏效了
  • @makoto 不要将 ASCII 值数字放在字符应该去的代码中,例如if (c == 48)if (c == '0') 更具可读性。事实上,如果您使用getchar() 输入,您可以查看if ('0' &lt;= c &amp;&amp; c &lt;= '9) printf ("%d is '%s'\n", c , arr[c-'0']);
  • @DavidC.Rankin 你说 if(c==48) 更具可读性。我就是这么做的。
  • 嗯,这与我所说的完全相反,但每个人都有自己的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多