struct Text{
int length;
char *txt;
};
void print(struct Text myTxt)
{
while ( myTxt.txt < myTxt.txt + myTxt.length )
{
printf("%c", ++myTxt.txt);
}
}
int main()
{
struct Text myText;
char test[] = "long long test text";
myText.length = sizeof (test) / sizeof (char);
myText.txt = test;
print(myText);
gets();
return 0;
}
我知道打印功能有问题,但是如何修复它。
答案 0 :(得分:3)
您的问题是print
修改传递给它的结构。具体来说,要打印每个字符,您需要递增myTxt.txt
然后打印它。您的while
循环也不正确:如果myTxt.txt < myTxt.txt + myTxt.length
大于零,myTxt.length
将始终为真。
你可以这样解决:
void print(struct Text myTxt)
{
char *txt = myTxt.txt;
while ( txt < myTxt.txt + myTxt.length )
{
printf("%c", *txt++);
}
}
这会将txt
设置为myTxt.txt
,因此您无需修改txt
即可修改myTxt.txt
。
答案 1 :(得分:2)
假设myTxt.length
大于零,myTxt.txt < myTxt.txt + myTxt.length
始终为真。
所以你的while循环永远不会终止。
[编辑]
好吧,我想它会在添加溢出int后终止。可能还不是你想要的。
答案 2 :(得分:2)
这应该没问题:
void print(struct Text myTxt) {
printf("%s", myTxt.txt);
}
(这当然要求myTxt.txt以空值终止,但对于c字符串,这是常见的。)
因此,除非您的字符串应该能够包含额外的空字节,否则您可以将代码更改为:
struct Text{
char *txt;
};
void print(struct Text myTxt)
{
printf("%s", myTxt.txt);
}
int main()
{
struct Text myText;
myText.txt = "long long test text";
print(myText);
return 0;
}
你可以通过调用
来获得字符串的长度
strlen(myTxt.txt);
IIRC要求:
#include string.h
答案 3 :(得分:2)
尝试:
void print(struct Text myTxt)
{
int i = 0;
while (i < myTxt.length )
{
printf("%c", myTxt.txt[i]);
i++;
}
}
你做错了什么:你打印了每个角色的地址,然后递增它。
mytxt.txt
正在做的是mytxt.txt = mytxt.txt + 1;
,因此当你检查while循环的参数时,你正在创建一个无限循环。
答案 4 :(得分:1)
如果需要支持NULL字节:
#include <ctype.h>
#include <stdio.h>
void print(struct Text *myTxt)
{
int i;
for (i = 0; i < myTxt->length; i++)
{
if (isprint(myTxt->txt[i]))
{
printf("%c", myTxt->txt[i]);
}
else
{
int num = (int)((unsigned char)myTxt->txt[i]);
printf("\\%x", num);
}
}
}
如果你不这样做:
#include <stdio.h>
void print(struct Text *myTxt)
{
printf("%s", myTxt->txt);
}