在运行时为字符串分配内存
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”作为第三个输入。
(为什么会这样?)
三个错误:
不检查 EOF
:
将while(c = getc(stdin),c!='\n')
改为while(c=getc(stdin),c!='\n'&&c!=EOF)
重新分配错误的字节数:
将str=realloc(str,i*sizeof(char));
更改为str=realloc(str,(i+1)*sizeof(char));
输入一个字符后,我们递增i
(i++
),因此下一个字符将存储在ith
位置。现在,为了在 ith
位置存储字符,字符数组的长度必须是 i+1
。所以,我们 realloc
和 i+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
输入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 个字节的大小。
我们创建清除变量以清除缓冲区。
它对我有用。确保一次插入所有字符串。
我正在编写一个程序来计算字符串中“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”作为第三个输入。 (为什么会这样?)
三个错误:
不检查
EOF
:将
while(c = getc(stdin),c!='\n')
改为while(c=getc(stdin),c!='\n'&&c!=EOF)
重新分配错误的字节数:
将
str=realloc(str,i*sizeof(char));
更改为str=realloc(str,(i+1)*sizeof(char));
输入一个字符后,我们递增
i
(i++
),因此下一个字符将存储在ith
位置。现在,为了在ith
位置存储字符,字符数组的长度必须是i+1
。所以,我们realloc
和i+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));
tostr=realloc(str,i+1);
Why? Because
sizeof char
is1
byte输入
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 个字节的大小。
我们创建清除变量以清除缓冲区。
它对我有用。确保一次插入所有字符串。