我的 C 编程背景非常薄弱,在学校学习了非常基础的 C 语言后,我刚刚重新开始编写 C 代码。
我正在用指针做练习,以了解我对它们的掌握程度,我想编写一个非常简单的 C 函数,它接受 3 个参数,一个字符串,它的暗淡字符串和另一个字符串,然后反转它们。
我的代码如下:
void inverter (char* cstringa, int dim, char* inversion) {
printf("%d\n", dim);
for (int i = 0; i < dim; i++) {
cstringa++;
}
for (int i = 0; i < dim; i++) {
*inversion = *cstringa;
printf("%c", *inversion);
inversion++;
cstringa--;
}
}
主要:
char stringa1[11] = {'A', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', '\0'};
char* pstringa1 = stringa1;
char inversione[strlen(stringa1)];
inversione[0] = '\0';
char* pinversione = inversione;
inverter(stringa1, strlen(stringa1), inversione);
for(int i = 0; i < strlen(inversione); i++) {
printf("%c", *pinversione);
pinversione++;
}
我希望这段代码能够反转我的字符串(string1=cstringa,它的dim=dim,string2=inversion),但它并没有这样做,因为当我给他内存地址时,值没有像我预期的那样存储在inversione中反转的第一个单元格。为什么会出现这种情况?
我还注意到,当我在反相器函数中逐个字符打印反相字符串时,它不会打印最后一个字母“A”,尽管尺寸和循环设置都是正确的。为什么?
感谢您的耐心等待。
我希望得到输出中第一个字符串的反转,并且通过引用传递的参数运行正常。
原因是因为你前进
cstringa++;
指向终止符,所以你需要将cstringa--;
移动到第二个循环的beginning。
另一个问题是使用
strlen(inversione)
时没有设置终止符,所以也需要添加该函数。
#include <stdio.h>
void inverter (char* cstringa, int dim, char* inversion) {
printf("%d\n", dim);
for (int i = 0; i < dim; i++) {
cstringa++;
}
for (int i = 0; i < dim; i++) {
cstringa--;
*inversion = *cstringa;
printf("%c", *inversion);
inversion++;
}
*inversion = 0;
printf("\n");
}
int main(void)
{
char stringa1[11] = {'A', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', '\0'};
char* pstringa1 = stringa1;
char inversione[strlen(stringa1)];
inversione[0] = '\0';
char* pinversione = inversione;
inverter(stringa1, strlen(stringa1), inversione);
for(int i = 0; i < strlen(inversione); i++) {
printf("%c", *pinversione);
pinversione++;
}
return 0;
}
输出:
10
ordnasselA
ordnasselA