关于指针和数组
About pointers and arrays
#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;
)相同。
现在,那有什么区别!!
那么区别(和相似性)是:
-
char ch;
声明一个char
变量,即分配一个大小为 1 字节的内存块(静态),您可以使用ch
引用。 -
另一方面,
char *letter;
声明了一个char pointer
即将分配 2 个、4 个或 8 个字节(取决于编译器)的内存大小(再次静态地)来存储char
变量的地址。
现在,当您像在循环中一样使用 *letter
作为左值(在左侧for
,这意味着您正在尝试写入存储在 letter
中的内存地址。在您的情况下,您从未在 letter
中存储任何地址,为此您可以使用letter = &ch;
其中ch
是某个char
变量。
这就是所有的讲座!!
现在我对你的程序的建议:
-
您不需要为循环使用
letter
指针,一个简单的char i
变量就可以了。 -
要按计划重新形成字符串,只需使用原始字符串的字符作为索引即可形成新字符串。声明一个长度很大的空字符串,然后在
for
循环中继续连接syllable[orig_string[i] - 'A']
,直到orig_string
结束。假设orig_string
包含所有大写字母 -
最后,更正
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 中查找一些有关指针和字符串操作的教程。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”