我被困在n0 v0w3ls exercise from CS50号公路上了.我想不出如何使用非空白输出.我完全搞不懂字符串/字符之间的数据类型转换,并将新值赋给输出字符.我try 了这么多组合,我再也不明白其中的区别了.现在,我的程序可以在调试器中运行,但输出为空.任何非常感谢的帮助;)

#include <cs50.h>
#include <stdio.h>
#include <string.h>

char replace(string input);

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Incorrect number of arguments\n");
        return 1;
    }
    else
    {
        printf("%c \n", replace(argv[1]));
    }

}

char replace(string input)
{
    int n = strlen(input);
    //n+1 as I read the last char should be a '\0' to be recognised as a string
    char s[n+1];

    for (int i = 0; i < n; i++)
    {
        //printf("%c\n", input[i]);
        switch (input[i])
        {
            case 97:
                s[i] = '6' ;
                break;
            case 101:
                s[i] = '3';
                break;
            case 105:
                s[i] = '1';
                break;
            case 111:
                s[i] = '0';
                break;
            default:
                s[i] = input[i];
                break;
        }
    }
    return s[n];
}

其目的是用数字代替元音.我试过了

  • 将输入作为字符串
  • 在该字符串的每个字符上循环
  • 如果字符是元音&gt;在我的输出字符串中替换它,否则保持原样
  • 是否返回我的输出字符数组/字符串?
// Write a function to replace vowels with numbers
// Get practice with strings
// Get practice with command line
// Get practice with switch

#include <cs50.h>
#include <stdio.h>
#include <string.h>

string replace(string input);

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Incorrect number of arguments\n");
        return 1;
    }
    else
    {
        printf("%s \n", replace(argv[1]));
    }

}

string replace(string input)
{
    int n = strlen(input);
    string s[n+1];

    for (int i = 0; i < n; i++)
    {
        //printf("%c\n", input[i]);
        switch (input[i])
        {
            case 'a':
                s[i] = "6" ;
                break;
            case 'e':
                s[i] = "3";
                break;
            case 'i':
                s[i] = "1";
                break;
            case 'o':
                s[i] = "0";
                break;
            default:
                s[i] = &input[i];
                break;
        }
    }
    s[n+1] = "\0";
    return s[n];
}

推荐答案

text of the assignment个国家声明了以下内容:

您的程序必须包含一个名为Replace的函数,该函数接受字符串输入并返回字符串输出.

它还规定:

REPLACE函数的输入参数将是argv[1],返回值是转换后的单词.

但是,您按如下方式声明了函数replace:

char replace(string input);

这是不对的.根据说明,该函数应返回string,而不是单个char,如下所示:

string replace(string input);

另一个问题是,这条线路

return s[n];

是错误的,因为s[n]是一个字符,但您需要返回string(即几个字符).

你可以写

return s;

相反,它将返回对字符串s的引用.然而,这也不会奏效,原因如下:

与诸如intcharfloatdouble之类的数据类型相比,CS50数据类型string是特殊的.类型为string的变量实际上并不表示几个字符.相反,它表示对字符数组的引用.它本身不是字符array.这种引用的技术术语是"指针".您将学习有关指针及其与week 4 of CS50中数据类型string的关系的所有内容.

当你写的时候

return s;

您返回的不是数组s中字符的值,而是对数组s的引用.

然而,一旦函数replace返回,本地数组s将不复存在.因此,返回对那个不存在的数组的引用是没有意义的.

这个问题有几种可能的解决方案,例如

  1. 使用全局数组而不是局部数组,这样数组的生存期不会在函数返回时结束,或者

  2. 使用动态分配的内存创建新数组,以便完全控制数组的生命周期,或者

  3. 不是写入单独的数组,而是简单地重写输入数组argv[1]并返回对该数组的引用.

我不建议您使用解决方案1,因为该解决方案相当难看.

解决方案#2通常是一个很好的解决方案,但这需要您在CS50的第4周才能获得的知识.由于您可能仍处于第2周,因此我建议您在完成课程的第4周之前不要try 此操作.

因此,我建议您现在使用解决方案#3.下面是一个例子:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

string replace(string input);

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Incorrect number of arguments\n");
        return 1;
    }
    else
    {
        printf("%s\n", replace(argv[1]));
    }
}

string replace(string input)
{
    int n = strlen(input);

    for (int i = 0; i < n; i++)
    {
        switch (input[i])
        {
            case 'a':
                input[i] = '6';
                break;
            case 'e':
                input[i] = '3';
                break;
            case 'i':
                input[i] = '1';
                break;
            case 'o':
                input[i] = '0';
                break;
        }
    }

    return input;
}

对于输入

testinput

该程序的输出如下:

t3st1nput

C++相关问答推荐

使用sd-设备列举设备导致seg错误

如何避免使用相对路径包含在c中

为什么信号量为空= 0,而不是阻塞?

无效使用未定义类型'structsquare'?

C指针算法在函数参数中的应用

如何使用Python C API实现多线程程序?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

CSAPP微型shell 实验室:卡在sigprocmask

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

FRIDA-服务器成为端口扫描的目标?

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

C语言中的外部关键字

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

Realloc():中止的下一个大小无效(核心转储)

带有数组指针的 struct 在print_stack()函数中打印随机数

浮点正零何时不全为零?

如何使crc32的结果与cksum匹配?

If语句默认为true