好的,所以我拥有的任务(我是学生)的想法是允许用户以这种形式插入一串单词:num1_num2_num3 ..._ numN。代码应该创建一个数组X,动态地给它内存,然后我应该用插入字符串用户的数字填充X.就那么简单。好吧,在函数stringuniz()
中,我认为我已经弄明白但它根本不会工作。它获得了第一个数字,但它然后停止,我认为它是因为休息。中断行为(如果我是对的)就像打破了整个代码而不仅仅是循环。你们知道为什么会这样吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void stringuniz(char *);
int *x;
int main(){
char s[50];
int i;
puts("Unesite string brojeva u formatu br1_br2_...brN: ");
gets(s);
stringuniz(s);
for(i=0;i<(sizeof(x)/sizeof(int));i++)
printf("%d",x[i]);
}
void stringuniz(char *s){
int duz,c=0,i,j,k=0,m=0;
char b[10];
duz=strlen(s);
for(i=0;i<duz;i++)
if(s[i]=='_')
c++;
x=(int*)malloc((c+1)*sizeof(int));
if(x==NULL) exit(1);
for(i=0;i<c+1;i++){
for(j=m;j<duz;j++){
if(s[j]!='_'){
b[k++]=s[j];
m++;
}
else{
b[k]='\0';
x[i]=atoi(b);
k=0;
m++;
break;
}
}
}
}
答案 0 :(得分:1)
此
(sizeof(x)/sizeof(int)
不会给你数组的大小。 sizeof(x)
是int*
的字节大小(可能是4或8)。
您需要记住字符串中_
的数量所隐含的大小。
此外,您还有一些错误的错误以供将来参考,您可能希望为您决定公开发布的代码选择更具描述性的变量名称。
一旦我将代码更改为:
,代码就适用于我#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void stringuniz(char *);
int *x;
int x_size = 0;
int main(){
char s[50];
int i;
puts("Unesite string brojeva u formatu br1_br2_...brN: ");
fgets(s,50,stdin);
stringuniz(s);
for(i=0;i<x_size;i++)
printf("%d\n",x[i]);
}
void stringuniz(char *s){
int duz,c=0,i,j,k=0,m=0;
char b[10];
duz=strlen(s);
for(i=0;i<duz;i++)
if(s[i]=='_')
c++;
x=malloc((c+1)*sizeof(int));
x_size = c+1;
if(x==NULL) exit(1);
for(i=0;i<=c+1;i++){
for(j=m;j<=duz;j++){
if(s[j]!='_' && s[j]!='\0'){
b[k++]=s[j];
m++;
}
else {
b[k]='\0';
x[i]=atoi(b);
k=0;
m++;
break;
}
}
}
}
答案 1 :(得分:0)
void stringuniz(char *);
int *x;
int main(){
[...]
}
void stringuniz(char *s){
[...]
}
我不知道为什么很多人用这种方式教它,但是在源文件的中间某处main
绝对没有用,并且把它放在最后也可以让你摆脱它前瞻性声明。所以,我会这样写:
int *x;
void stringuniz(char *s){
[...]
}
int main(){
[...]
}
然后你应该开始更多地使用空格字符。
stringuniz(s);
for(i=0;i<(sizeof(x)/sizeof(int));i++)
printf("%d",x[i]);
在评论中,alain已经指出,sizeof(x)
将返回指针的大小。因此,您需要一种不同的方法来计算数组的大小。一种方法是在size_t x_len;
之外添加变量int * x;
。此外,您应该使用curley括号,即使是一行语句,相信我,不仅使代码更具可读性,还可以防止在以后的更改中引入错误。
for (i = 0; i < x_len; i++) {
printf("%d", x[i]);
}
void stringuniz(char *s){
int duz,c=0,i,j,k=0,m=0;
char b[10];
b
将保留用户输入的字词。如果他的单词长度超过9个字符,那么这里会出现缓冲区溢出。
duz=strlen(s);
for(i=0;i<duz;i++)
if(s[i]=='_')
c++;
您正在计算此处的字数。因此,请使用更具描述性的名称,例如num_words
而不是c
。顺便说一句:这是上面提到的x_len
。
x=(int*)malloc((c+1)*sizeof(int));
无需转换malloc
的返回值。实际上它可能会隐藏错误。另外,我会使用sizeof(*x)
而不是sizeof(int)
,因为如果更改x的类型,则在语句中还必须更改malloc
调用。在我的陈述中,malloc
电话不需要以任何方式触及。
x = malloc((c+1) * sizeof(*x));
if(x==NULL) exit(1);
for(i=0;i<c+1;i++){
for(j=m;j<duz;j++){
if(s[j]!='_'){
b[k++]=s[j];
您正在不断覆盖b,并且正在阅读下一个单词。既然你还没有使用它,你可以跳过这一行。
m++;
}
else{
b[k]='\0';
x[i]=atoi(b);
k=0;
m++;
break;
这个break;
只会突破最里面的for (j
- 循环。
}
}
}
}