为什么打破让我一次摆脱2个循环以及如何解决它

时间:2016-11-27 20:18:38

标签: c break

好的,所以我拥有的任务(我是学生)的想法是允许用户以这种形式插入一串单词: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;
            }

        }
    }
}

2 个答案:

答案 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 - 循环。

            }
        }
    }
}