c - Linux 终端中忘记用户用 C 输入的代码

标签 c linux

我已经编写了代码,但是我不记得如何获取用户的输入。

运行代码的命令是 ./rle "HHEELLLLO W" 但在我的代码中,我不知道如何让代码读取 "HHEELLLLO W".

如果我有一个常规的 printf 函数,该代码将工作并打印 H1E1L3O 0W0 但我希望它可以计算任何用户的输入。

我尝试使用atoi,但我认为我做错了,而且我不知道如何修复它。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RLEN 50

char* encode(char* src)
{
    int rLen;
    char count[MAX_RLEN];
    int len = strlen(src);

    char* dest = (char*)malloc(sizeof(char) * (len * 2 + 1));

    int i, j = 0, k;


    for (i = 0; i < len; i++) {


        dest[j++] = src[i];


        rLen = 1;
        while (i + 1 < len && src[i] == src[i + 1]) {
            rLen++;
            i++;
        }


        sprintf(count, "%d", rLen);


        for (k = 0; *(count + k); k++, j++) {
            dest[j] = count[k];
        }
    }


    dest[j] = '\0';
    return dest;
}


int main(int argc, char ** argv)
{
    char str[] = atoi(argv[1]);
    char* res = encode(str);
    printf("%s", res);
    getchar();
}

当我编译它时,我收到此错误:

rle.c: In function ‘main’:
rle.c:47:18: error: invalid initializer
     char str[] = atoi(argv[1]);
                  ^~~~
rle.c:45:14: error: unused parameter ‘argc’ [-Werror=unused-parameter]
 int main(int argc, char ** argv)
              ^~~~
cc1: all warnings being treated as errors

最佳答案

atoi 将字符串(数字)转换为整数,这与您在此处执行的操作不同。

我建议采用以下两种方法之一:

(1) 直接使用命令行参数:

int main(int argc, char ** argv)
{
    char* str = argv[1];
    char* res = encode(str);
    printf("%s\n", res);
}

这是有效的,因为 argv[1] 已经是一个字符串,正如您所希望的那样。 (事实上​​,在这种情况下,您甚至不需要 str;您只需执行 char* res =encode(argv[1]);。)

在这种情况下,您将遇到 shell 会将命令行分解为 argv[1]argv[2] 等单词的问题,因此 argv[1] 将仅包含第一个单词。您可以在命令行上使用引号将所有内容强制放入 argv[1] 中,或者使用下一种技术。

(2) 读取用户的一行:

int main(int argc, char ** argv)
{
    char str[100];
    printf("type a string:\n");
    fgets(str, sizeof(str), stdin);
    char* res = encode(str);
    printf("%s\n", res);
}
<小时/>

在这两种情况下,理论上您还应该进行一些额外的错误检查。

在第一种情况下,您假设用户实际上给了您一个命令行参数。如果用户在不提供参数的情况下运行您的程序,argv[1] 将是一个空指针,您的代码可能会崩溃。为了防止这种情况,您可以添加测试

if(argc <= 1) {
    printf("You didn't type anything!\n");
    exit(1);
}

同时您可以仔细检查是否没有任何额外的参数:

if(argc > 2) {
    printf("(warning: extra argument(s) ignored)\n");
}

在第二种情况下,当您提示用户时,他们仍然有可能不会输入任何内容,因此您应该检查 fgets 的返回值:

if(fgets(str, sizeof(str), stdin) == NULL) {
    printf("You didn't type anything!\n");
    exit(1);
}

如果您尝试这样做,您会注意到,还存在 fgets\n 留在缓冲区中的问题,这可能不是您想要的。

关于c - Linux 终端中忘记用户用 C 输入的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891714/

相关文章:

c - 如何用gtk+-3.0编译程序?

c - 在C中实现 `executeUsingPATH()`

c - 描述和重写试卷中的示例代码

Linux:如何将 block 设备映射到 USB 设备?

linux - 在 Linux 中检测系统负载,重点放在 "swap thrashing"

c - GLib v APR 各自的优缺点

c - 二维数组引用整个索引,而不是 C 中的单个单元格

linux - Internet Explorer 尝试在 Jboss 服务器上打开 Excel 但失败

python - Boto3 不使用配置文件中的 key

android - 适用于 Android SDK 的 Eclipse 的正确版本