在C中排列不需要的字符

时间:2014-06-13 17:57:28

标签: c arrays char

好的,我是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个字符串?

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;在一行而不是数组中的每一行?

    没有办法,您可以在循环中复制元素或使用memcpystrcpy等函数。单词提出问题:

    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。很简单,不是吗?