【问题标题】:C Program that prints random symbols after correct output正确输出后打印随机符号的C程序
【发布时间】:2018-09-21 23:14:01
【问题描述】:

我想用 C 语言编写一个程序,将小写字母更改为大写字母,反之亦然,包括 .要么 -。当我给它一个没有符号的输入时,它工作得很好,但是当我插入符号时,程序会打印随机字符。我对此感到困惑,我不知道为什么会发生这种情况。

我已经看到了两个类似问题的帖子,但仍然没有弄清楚我的问题,这两个帖子是:

输入示例1:

asd.DSA

输出示例1:

ASD.dsa

1-\y�

输入示例2:

asdDSA

输出示例 2:

ASDdsa

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

int main(void) {
    pid_t readWrite;
    pid_t changeString;

    readWrite = fork();

    if(readWrite == 0) {
        char str[49];
        while(fgets(str, 50, stdin) != NULL) {
            printf("%s", str);

            changeString = fork();

            if(changeString == 0) {
                int result = 0;
                char newstr[49];
                for(int i = 0; i < strlen(str); i++) {
                    if(str[i] >= 'A' && str[i] <= 'Z') {
                        newstr[result++] = str[i] + 32;
                    } else if (str[i] >= 'a' && str[i] <= 'z') {
                        newstr[result++] = str[i] - 32;
                    } else {
                        newstr[result++] = str[i];
                    }
                }

                printf("%s", newstr);

                break;
            }
        }

    }
    while(wait(NULL)>0);
    return 0;
}

【问题讨论】:

  • 很好minimal reproducible example,+1,只是缺少标题。
  • if(str[i] &gt;='A' &amp;&amp; str[i] &lt;='Z') { 更易于人类阅读。
  • 抱歉已经改了。
  • 你为什么要分叉?
  • 我使用 fork 是因为目标是第一个进程读取输入并打印输出,而第二个进程用于更改字母,但由于我有这个错误我还没有实现那个。

标签: c string printf uppercase lowercase


【解决方案1】:
  • newstr 应该以 nul 结尾(或用 printf("%.*s", result, newstr) 打印)
  • fgets 可能会溢出 str 一个字节

【讨论】:

  • 你是对的,我添加的只是 nul-terminate newstr,new 它工作正常。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多