关于指针和数组

About pointers and arrays

本文关键字:数组 指针 于指针      更新时间:2023-10-16
#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("%cn",&letter);
    }
}

Tutnese是一种英语游戏,主要由使用它进行交谈的儿童使用(感知)来自成年人的隐私(反之亦然)

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

"

计算机"变成了"Cashomumpubututerug"。- "石"变成"苏斯图托努克"

但是我刚开始学习C,我不知道如何使用指针。我一直收到错误,例如赋值从指针制作整数而没有强制转换

char *letter;
此语句声明一个名为 letter 的变量,与任何其他语句(如 char ch;)相同。

现在,那有什么区别!!

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

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

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

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

这就是所有的讲座!!

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

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

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

  3. 最后,更正printf语法。

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

代码

#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++) != '')
    {
        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 = '';
}
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.

让我们忘记指针并分解问题。系统会给你一个单词word,并且你想要根据映射创建newword

首先,您需要弄清楚newword有多大。为此,请遍历word中的字符并添加映射的字符串长度(称为 N )完成此操作后,您就知道可以为newword分配 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 中查找一些有关指针和字符串操作的教程。