gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:31 26 4
gpt4 key购买 nike

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

代码是:

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

int penalty_shoot(char* s){
int count=0,i=0;
while(s[i]!='\0'){
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] ='\0';
printf("%s\n",str);
printf("%d\n",penalty_shoot(str));

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

输入是:

3
101201212110
10101
2120

我面临两个问题:

1)我觉得动态分配不正常。我在 stackoverflow 上看到各种代码编写了动态分配的代码。 (任何人都可以建议一些更改。)

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));

    输入一个字符后,我们递增i (i++),因此下一个字符将存储在ith<​​ 位置。现在,为了将字符存储在第i 位置,字符数组的长度必须为i+1。因此,我们用 i+1realloc

    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 .

关于c - 在运行时为字符串分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49708191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com