在运行时为字符串分配内存

Allocating Memory to String at runtime

我正在编写一个程序来计算字符串中“2”后跟“1”的出现次数。 我动态分配了字符串

代码是:

#include <stdio.h>
#include<stdlib.h>

    int penalty_shoot(char* s){
        int count=0,i=0;
        while(s[i]!='[=10=]'){
           if(s[i]=='2')
                if(s[i+1]=='1')
                    count++;
        i++;
        }
        return count;
    }

    int main() {
        int t;
        int i=0;
        scanf("%d",&t);           //t is for number of test cases.
        while(t--){
            char *str, c;
            str = (char*)malloc(1*sizeof(char));
            while(c = getc(stdin),c!='\n')
            {
                str[i] = c;
                i++;
                str=realloc(str,i*sizeof(char));
            }
            str[i] ='[=10=]';
            printf("%s\n",str);
            printf("%d\n",penalty_shoot(str));

            free(str);
            str=NULL;
            i=0;
        }
        return 0;
    }

输入是:

3
101201212110
10101
2120

我面临两个问题:

1) 我感觉动态分配不起作用 fine.I 写了动态分配的代码,看到了 Whosebug 上的各种代码。 (任何人都可以提出一些更改建议。)

2) 代码未读取“2120”作为第三个输入。 (为什么会这样?)

三个错误:

  1. 不检查 EOF:

    while(c = getc(stdin),c!='\n')改为while(c=getc(stdin),c!='\n'&&c!=EOF)

  2. 重新分配错误的字节数:

    str=realloc(str,i*sizeof(char));更改为str=realloc(str,(i+1)*sizeof(char));

    输入一个字符后,我们递增ii++),因此下一个字符将存储在ith 位置。现在,为了在 ith 位置存储字符,字符数组的长度必须是 i+1。所以,我们 realloci+1.

    Just for the sake of brevity, as suggested by Basile, you might as well do this:

    Change str=realloc(str,(i+1)*sizeof(char)); to str=realloc(str,i+1);

    Why? Because sizeof char is 1 byte

  3. 输入t后不消耗\n:

    scanf("%d",&t);更改为scanf("%d ",&t);scanf("%d\n",&t);

    scanf("%d ",&t);scanf("%d\n",&t);

    它们都有效。你为什么问?阅读取自另一个 SO 答案 here:

    的解释

    An \n - or any whitespace character - in the format string consumes an entire (possibly empty) sequence of whitespace characters in the input. So the scanf only returns when it encounters the next non-whitespace character, or the end of the input stream.

已测试 here

你可以在用户输入测试时使用scanf("%d ", &t); 然后就在第二个 while 循环之前,哪个条件应该是 c != '\n'c = getchar(); 然后确保您创建了一个 char 变量,我称之为 mine clear,它接收 0,因此当您在启动字符串后循环时,您再次写入 c = clear; 并在其下方再次写入 c = getchar()。并且当您使用 realloc 时,请确保将其增大 (i+1),因为 char 只有 1 个字节的大小。

我们创建清除变量以清除缓冲区。

它对我有用。确保一次插入所有字符串。