好的,我是C.的初学者。我认为对于一个数组来说,需要将其声明为:
char a[10];
所以我将有10个元素(0到9) 但它没有用。它给了我不需要的字符。你能告诉我问题是。我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
printf("%s",rand_string());
}
int rand_string(void)
{
srand(time(NULL));
char a[7];
int e;
int d;
a[0]='l';
a[1]='o';
a[2]='n';
a[3]='g';
a[4]=' ';
d=(rand()%6) + 97;
a[5]=d;
e=(rand()%10) + 48;
a[6]=e;
printf("\n%s\n",a);
return a;
}
我得到的结果如下: 长f99 | /
我的期望: 长f9
好的总共我有4个问题: *如何解决不需要的字符问题以及为什么要提供未打字的字符? *我的生成随机数的方式是否有限制? *如何写前4个字母&#34; long&#34;在一行而不是数组中的每一行? *如何组合2个字符串?
答案 0 :(得分:5)
你需要NULL terminate你的字符串。将数组扩展一个并在其中添加a[7] = 0;
,然后设置即可。
编辑说明:您的程序有另一个大问题,因为您正在返回指向局部变量的指针。您可能希望更改rand_string
以填写main
提供的缓冲区。以下是这两项修改的快速示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void rand_string(char a[8])
{
srand(time(NULL));
int e;
int d;
a[0]='l';
a[1]='o';
a[2]='n';
a[3]='g';
a[4]=' ';
d=(rand()%6) + 97;
a[5]=d;
e=(rand()%10) + 48;
a[6]=e;
a[7]=0;
printf("\n%s\n",a);
}
int main(void)
{
char buffer[8];
rand_string(buffer);
printf("%s", buffer);
return 0;
}
答案 1 :(得分:1)
第一个问题已由Carl Norum回答。
我的生成随机数的方式是否有限制?
是的,但定义一个函数会很好,不是吗?像a[0] = randomBetween(97, 102);
这样的呼叫更具可读性。
编辑:正如上述评论所述:您甚至可以写
a[0] = randomBetween('a', 'f');
只是更具可读性; - )
如何写前4个字母&#34; long&#34;在一行而不是数组中的每一行?
没有办法,您可以在循环中复制元素或使用memcpy,strcpy等函数。单词提出问题:
a[0] = 'l'; a[1] = 'o'; a[2] = 'n'; a[3] = 'g';
但这不是你想要的,我猜:-)另见下面的strcpy-example。
如何组合2个字符串?
再次,使用循环或上述功能:
char *first = "Hello ";
char *second = "World";
char combined[12];
int currentIndex = 0, i = 0;
// copy characters from "first" as long we did not find a \0
while(first[i] != 0)
combined[currentIndex++] = first[i++];
i = 0;
// copy characters from "second" as long we did not find a \0
while(second[i] != 0)
combined[currentIndex++] = second[i++];
// finally don't forget to null-terminate!
combined[currentIndex] = 0;
使用例如strcpy要容易得多; - )
char *first = "Hello ";
char *second = "World";
char combined[12];
strcpy(combined, first);
strcpy(&combined[6], second);
我们在这做什么?第一个strcpy-call简单地复制&#34;第一个&#34;到&#34;合并&#34;。但第二次电话似乎很有趣。在那里我们复制&#34;第二&#34;到第7位(从0开始计数,因此6)。在第一个函数调用之后,此位置是\0
- 字符。但是我们不希望字符串在这里结束,所以我们用第二个字符串的第一个字符覆盖它。一个好处是strcpy自动复制终止的\ 0。很简单,不是吗?