1
#include<stdio.h>
#include<stdlib.h>

char *syllable[26] = {"a","bub","cash","dud","e","fud","gug","hash","i","jay",
    "kuck","lul","mum","nun","o","pub","quack","rug","sus",
    "tut","u","vuv","wack","xux","yuck","zug"};

void Tutnese(char *word, char *newword);
char *letter;


void Tutnese(char *word, char *newword)
{

    //clrscr();
    for(*letter = 'A'; *letter <= 'Z'; *letter++)
    {
        letter=syllable;
        printf("%c\n",&letter);
    }
}

Tutnese 是一种英语游戏,主要由儿童使用,他们使用它在(感知到的)成年人的隐私中交谈(反之亦然)

我试图让 A="A" B="bub" c="cash" 等等。我期待这样的结果。

“计算机。” 变成“cashomumpubututerug”。- “Stony”变成“Sustutonunyuck”

但我刚开始学习c,我不知道如何使用指针。我一直在收到错误,例如赋值从指针中生成整数而不进行强制转换

4

3 回答 3

1

char *letter;
该语句声明了一个名为 的变量letter,与任何其他语句类似的方式相同char ch;

现在,那有什么区别!!

那么区别(和相似性)是:

  1. char ch;声明一个char变量,即分配一个大小为 1 字节的内存块(静态),您可以使用ch.

  2. char *letter;另一方面,声明一个char pointer2 或 4 或 8 个字节的内存大小(取决于编译器)将被分配(再次静态)以存储变量地址char

现在,当您*letter像在循环中一样使用左值(在左侧)时for,这意味着您正在尝试写入存储在letter. 在您的情况下,您从未在 中存储任何地址letter,为此您可以使用letter = &ch;wherech是一些char变量。

这就是全部的讲座!!

现在我对您的程序的建议:

  1. 您不需要letter为循环使用指针,一个简单的char i变量就可以了。

  2. 要按照您的计划重新形成字符串,您可以简单地使用原始字符串的字符作为索引来形成新的字符串。声明一个大长度的空字符串,然后syllable[orig_string[i] - 'A']for循环中继续连接 , 直到orig_string. 假设是orig_string包含所有大写字母

  3. 最后,更正你的printf语法。

一定要从一个好的来源阅读C 中的指针,因为它们永远不会离开你,并且会给你带来各种各样的噩梦。

于 2013-10-14T04:23:27.280 回答
0

代码

#include <ctype.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *syllable[26] = {"a","bub","cash","dud","e","fud","gug","hash","i","jay",
    "kuck","lul","mum","nun","o","pub","quack","rug","sus",
    "tut","u","vuv","wack","xux","yuck","zug"};

void Tutnese(char *word, char *newword, size_t new_size);

void Tutnese(char *word, char *newword, size_t new_size)
{
    char *end = newword + new_size;
    char c;
    while ((c = *word++) != '\0')
    {
        if (!isalpha(c))
            *newword++ = c;
        else
        {
            char *tut = syllable[tolower(c) - 'a'];
            ptrdiff_t len = strlen(tut);
            if (end - newword <= len)
                break;
            memcpy(newword, tut, len + 1);
            newword += len;
        }
    }
    *newword = '\0';
}

int main(void)
{
    char i_data[1024];
    char o_data[4096];

    while (fgets(i_data, sizeof(i_data), stdin) != 0)
    {
        Tutnese(i_data, o_data, sizeof(o_data));
        printf("I: %sO: %s", i_data, o_data);
    }
    return(0);
}

输出

I: computer
O: cashomumpubututerug
I: how do you tell mum that she cannot understand us?
O: hashowack dudo yuckou tutelullul mumumum tuthashatut sushashe cashanunnunotut ununduderugsustutanundud usus?
I: The quick brown fox jumped over the lazy dog.
O: tuthashe quackuicashkuck bubrugowacknun fudoxux jayumumpubedud ovuverug tuthashe lulazugyuck dudogug.
于 2013-10-14T05:03:29.273 回答
0

让我们忘记指针并分解问题。给你一个词word,你想newword根据你的映射来创建。

首先,你需要弄清楚有多大newword。为此,遍历其中的字符word并添加映射的字符串长度(调用它N)一旦完成,您就知道可以为newword(via ) 分配 N+1 个字节(字符串在 C 中以 null 结尾malloc)。然后,您再次遍历字符并附加到newword

让我给你一些提示:要遍历一个字符串(让我们调用它word),C 代码看起来像:

unsigned int wordlen = strlen(word);
for(unsigned int index = 0; index < wordlen; index++)
    printf("Character at %u is %c", index, word[index]);

您的 for 循环非常混乱。一定要查找一些关于 C 中指针和字符串操作的教程。

于 2013-10-14T03:49:44.677 回答