循环不在C的最后一次迭代中执行最后一个语句?

时间:2016-03-13 02:49:30

标签: c for-loop

for循环不是在循环体中执行最后一个语句,如果它是最后一次迭代(或只是一次迭代)。并且即使它只包含printf()语句并且还跳过函数体中的下一个语句也无法正常工作。这是代码:

void build()
{
    int i;
    system("clear");
    printf("\nBuild the table");
    printf("\n");
    printf("\nMaximum number of entries ------> 20");
    printf("\nHow many do u want------>");
    scanf("%d",&num);
    printf("\nEnter the following items\n");
    for(i=0;i<num;i++)
    {
        printf("\nName ");
        scanf("%s",emp[i].name);        
        printf("\nCode");
        scanf("%ld",&emp[i].code);      
        printf("\nDesignation");
        scanf("%s",emp[i].designation);     
        printf("\nAge");
        scanf("%d",&emp[i].age);        
        printf("\nYears of experience");
        scanf("%d",&emp[i].exp);        
        printf("\nHello everyone");
    }
    for(i=0;i<num;i++)
    {
        printf("\n%s",emp[i].name);
        printf("\n%ld",emp[i].code);
        printf("\n%s",emp[i].designation);
        printf("\n%d",emp[i].age);
        printf("\n%d",emp[i].exp);
    }
    printf("\nGoing to main menu"); 
}


struct employee
{
    char name[20];
    long int code;
    char designation[20];
    int exp,age;
};
struct employee emp[max];

我在函数中的for循环面临同样的问题,上面是结构声明,其中max = 20;

2 个答案:

答案 0 :(得分:1)

你的分析是错误的 - 问题不是执行而是行缓冲。

function $FncSendLocalNotification($QsContentTitle, $QsContentText, $QsId) { ​ if (OS_ANDROID) { ​ $FncTiApiInfo("Local notification fired for Id: " + $QsId); ​ //> Intent object to launch the application var $Intent = Ti.Android.createIntent({ action : Ti.Android.ACTION_MAIN, //> Substitute the correct class name for your application className : 'com.myapp.test.testActivity', //> Substitue the correct package name for your application packageName : Ti.App.id }); $Intent.flags |= Ti.Android.FLAG_ACTIVITY_CLEAR_TOP | Ti.Android.FLAG_ACTIVITY_NEW_TASK; $Intent.addCategory(Ti.Android.CATEGORY_LAUNCHER); ​ //> Create a PendingIntent to tie together the Activity and Intent var $Pending = Titanium.Android.createPendingIntent({ intent : $Intent, flags : Titanium.Android.FLAG_UPDATE_CURRENT }); ​ //> Create the notification var $Notification = Titanium.Android.createNotification({ //> icon is passed as an Android resource ID -- see Ti.App.Android.R. //> platforms/android/res/drawable/my_icon.png icon :Ti.App.Android.R.drawable.notification, contentTitle : $QsContentTitle, contentText : $QsContentText, contentIntent : $Pending }); ​ //> Send the notification Titanium.Android.NotificationManager.notify($QsId, $Notification); } ​ } 有几种优化io的模式 - 最常见的误解是线缓冲,碰巧在遇到换行时自动刷新。

所以

printf

不会刷新,因为换行符不在最后

其中

printf("\nGoing to main menu"); 

会冲洗。如果你必须按照你的方式使用fflush,比如

printf("Going to main menu\n");  

强行冲洗

答案 1 :(得分:0)

这是一个C表面概念的部分。情况是,如果没有将新行(\n)附加到printf()语句,那么我们就会遇到问题。

它确实在很大程度上依赖于编译器,但我们在每个printf()语句中添加一个新行是一种很好的做法。

所以,让最后一句话,即 第33行 更改为以下内容:

printf("\nGoing to main menu\n")

现在\n帮助的原因是,在看到新行时,编译器将执行flush。现在说了这句话,如果你仍然坚持没有新行,那么看看下面的代码::))

printf("\nGoing to main menu") fflush(stdout);